当前位置: 首页 > news >正文

Template -- React

React

版本

  • Node 21.6.0
  • Npm 10.2.4

项目

创建

npm init vite 项目名称
  • react
  • js
  • npm i
  • npm run dev

依赖

npm i axios                 # 网络
npm i antd --save           # UI
npm i @ant-design/icons
npm i react-router-dom      # 路由npm i sass -D               # sass
npm i vite-plugin-html -D   # html

环境区分

  • package.json
"scripts" : {"dev": "vite --mode test","dev1": "vite --mode production","build": "vite build --mode test","build1": "vite build --mode production"
}
  • package.json 同级
  • .env.test
NODE_ENV = "test"
VITE_APP_TITLE = "测试"
VITE_APP_BASE_API = "test"
  • .env.production
NODE_ENV = "production"
VITE_APP_TITLE = "生产"
VITE_APP_BASE_API = "production"
  • vite.config.js
import { defineConfig,loadEnv } from 'vite'
import react from '@vitejs/plugin-react'
import { createHtmlPlugin } from "vite-plugin-html";
import { resolve } from "path";// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) =>{const env = loadEnv(mode, process.cwd(), ""); return {plugins: [react(),createHtmlPlugin({inject: {data: {title: env.VITE_APP_TITLE,},},}),],resolve: {alias: {"@": resolve(__dirname, "src"), // 设置 `@` 指向 `src` 目录},},base: "./", // 设置打包路径server: {port: 4000, // 设置服务启动端口号open: true, // 设置服务启动时是否自动打开浏览器cors: true, // 允许跨域// 设置代理,根据我们项目实际情况配置// proxy: {//   '/api': {//     target: 'http://xxx.xxx.xxx.xxx:8000',//     changeOrigin: true,//     secure: false,//     rewrite: (path) => path.replace('/api/', '/')//   }// }},};
})
  • index.html
<title><%= title %></title>

axios

  • src/http/index.js
import axios from "axios";let service = axios.create({// baseURL: "https://cnodejs.org/api/v1", //相同绝对路径baseURL:import.meta.env.VITE_APP_BASE_API,timeout: 100000, //超过这么多时间,则请求终止headers: {//请求头携带数据的格式"Content-Type": "application/json;charset=UTF-8",// "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",},
});
// 添加请求拦截器(Interceptors)
service.interceptors.request.use(function (config) {// 发送请求之前做写什么let token = localStorage.getItem("token");// 如果有if (token) {// 放在请求头(token跟后端沟通,他需要什么该成什么就可以了)config.headers.authorization = token;}return config;},function (error) {// 请求错误的时候做些什么return Promise.reject(error);}
);
// 添加响应拦截器
service.interceptors.response.use(function (response) {// 对响应数据做点什么return response.data;},function (error) {// 对响应错误做点什么return Promise.reject(error);}
);export default service;
  • src/http/api.js
import request from "./index";export async function Ceshi(params) {return request({url: "/topics",method: "GET",params,});}export async function Ceshi2(data) {return request({url: "/Storage/GetStorageLack",method: "POST",data,});}
  • 使用
import {useEffect, useRef } from "react";
import { Ceshi } from "@/http/api.js";
function App() {const cache = useRef(null);useEffect(() => {async function fetchData() {cache.current = true;const response = await Ceshi();console.log(response);}if (!cache.current) {fetchData();}}, []);return (<></>);
}

antd

  • 使用
import { Button } from "antd";<><Button type="primary">Button</Button>
</>

sass

.ddd{.adsspan{color: aqua;}
}

router

  • main.jsx
import { HashRouter } from "react-router-dom";
<HashRouter><App></App></HashRouter>
  • App.jsx
import { useRoutes,useNavigate  } from "react-router-dom";const navigate = useNavigate()
const GetRoutes = () => {const routes = useRoutes([{path: "/",element: <Home></Home>,},{path: "/b",element: <B></B>,children: [{path: "/b/aaaa", // /b 需要加,不加找不到element: <C></C> ,},],},{path: "/*",exact: true,element: <div>后台404</div>,},]);return routes;
};
<GetRoutes /><Button type="primary" onClick={()=> navigate('/b/aaaa')}>Button</Button>// 在b页面中加
<Outlet></Outlet>
http://www.lryc.cn/news/285343.html

相关文章:

  • HTML 入门手册(一)
  • GPT帮我快速解决工作上的问题案例
  • Day32- 贪心算法part06
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • 【每周AI简讯】GPT-5将有指数级提升,GPT Store正式上线
  • QT上位机开发(MFC vs QT)
  • 线性代数:矩阵的定义
  • k8s 使用cert-manager证书管理自签
  • SpringSecurity+JWT前后端分离架构登录认证
  • 笔试面试题——二叉树进阶(一)
  • Java反射示例
  • 【WinForm.NET开发】实现使用后台操作的窗体
  • 【操作系统和计网从入门到深入】(四)基础IO和文件系统
  • 四.Winform使用Webview2加载本地HTML页面并互相通信
  • 如何有效清理您的Python环境:清除Pip缓存
  • Jira 母公司全面停服 Server 产品,用户如何迁移至极狐GitLab
  • Docker安装配置OnlyOffice
  • 启动低轨道卫星LEO通讯产业与6G 3GPP NTN标准
  • PICO Developer Center 创建和调试 ADB 命令
  • 【VRTK】【PICO】如何快速创建一个用VRTK开发的PICO项目
  • 国产操作系统:VirtualBox安装openKylin-1.0.1虚拟机并配置网络
  • 本地git切换地区后,无法使用ssh访问github 22端口解决方案
  • Chat2DB:AI赋能的多数据库客户端工具,开源领航未来数据库管理
  • SQL Server修改数据字段名的方法
  • Flutter编译报错Connection timed out: connect
  • PG DBA培训26:PostgreSQL运维诊断与监控分析
  • 运维之道—生产环境安装Redis
  • 人工智能数学验证工具LEAN4【入门介绍3】乘法世界-证明乘法的所有运算律
  • Armv8-M的TrustZone技术简介
  • ctfshow-反序列化(web267-web270)