# React18-admin-pc **Repository Path**: zhao-jingtao-l/react18-admin-pc ## Basic Information - **Project Name**: React18-admin-pc - **Description**: 基于React全家桶,React-router-dom,React-redux的后台管理系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2023-02-20 - **Last Updated**: 2025-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: React, react-redux, react-router-dom5, redux-thunk ## README # 基于React的后台管理系统的项目流程 ## 一、安装生产依赖包 ```shell npm i axios npm i events npm i react-redux npm i react-router-dom(用的是5版本) npm i antd npm i redux-thunk ``` ## 二、安装开发依赖包 ```shell npm i customize-cra npm i http-proxy-middleware npm i react-app-rewired ``` ## 三、配置反向代理 > 在 src 下新建一个 setupProxy.js文件 :文件命名要一致 ```js // 第一步: 导出下载好的 http-proxy-middleware 中间件 const { createProxyMiddleware } = require('http-proxy-middleware') // 设置跨域代理 // /api 表示当你的页面中的请求地址中包含 /api 这个字段的时候, // target: 表示目标地址: 就使用本地服务器去请求目标服务器的域名地址 // changeOrigin 是否允许跨域 // pathRewrite : 重写地址: /api 替换成'' module.exports = function (app) { app.use( createProxyMiddleware('/api', {//api是需要转发的请求(所有带有/api前缀的请求都会转发给5000) target: 'https://api.i-lynn.cn/college', //配置转发目标地址(能返回数据的服务器地址) changeOrigin: true, //控制服务器接收到的请求头中host字段的值 /* changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:8000 changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:3000 changeOrigin默认值为false,但我们一般将changeOrigin值设为true */ pathRewrite: { '^/api': '' } //去除请求前缀,保证交给后台服务器的是正常请求地址(必须配置) }) ) } ``` ## 四、配置路由模式 > 在 index.js 文件中 ```js // 设置 BrowserRouter 路由模式 import { BrowserRouter as Router } from 'react-router-dom' root.render( // 使用 Provider 包裹根组件 ); ``` ## 五、配置redux的全局配置 > 在 index.js中 ```js // 引入 store 仓库 import store from './store/store'; // 从 react-redux 中解构出 Provider组件 import { Provider } from 'react-redux'; // 使用 Provider 包裹根组件 使用store属性 提供数据 ``` ## 六、配置 config-overrides.js > 在**当前项目根目录下**面创建一个名称为`config-overrides.js`文件,对webpack进行配置(该配置方式不是对react内置配置进行直接修改,而是通过三方的包实现配置覆盖) ```js // 配置信息可以参考:https://www.npmjs.com/package/customize-cra // 修改react脚手架中的默认的webpack的配置, 在该文件中 添加额外的配置,覆盖掉node_nodules中webpack的默认配置,达到修改项目webpack的目的 const { override, addDecoratorsLegacy, disableEsLint, addBundleVisualizer, addWebpackAlias, adjustWorkbox, } = require("customize-cra"); const path = require("path"); module.exports = override( // 在webpack中禁用eslint disableEsLint(), // 添加webpack别名 addWebpackAlias({ // 添加路径对@符号的支持 ["@"]: path.resolve("./src"), }) ); ``` ## 七、使用antd组件库 ```shell npm i antd --save ``` ```js // 引入样式 import 'antd/dist/antd.css'; ``` ## 八、在路由表中以懒加载的方式加载组件 > 1. 先从 react中拿出来 lazy和Suspense ```jsx // 配置路由的组件 import React, { Component, lazy, Suspense } from 'react'; ``` > 2. 以懒加载的方式引入组件 ```jsx // 以懒加载方式引入组件 const lazyLoading = lazy(() => import('../components/AdminLogin/AdminLogin')) ``` > 3. 在创建路由的时候使用 Suspense组件 ```jsx // 导入路由总组件 class Index extends Component { render() { return ( <> }> {/* 重定向 */} {/* 登录 */} {/* 404 */} ); } } ``` > 注意: Suspense 是react 内置的组件, 负责渲染某一个组件, 一般配合懒加载使用 > > 该组件有一个 fallback,值为 组件渲染前执行的组件效果,可以值为loading 组件 ## 九、在函数组件中使用ref拿到实例对象 > 需要解构出 forwardRef , useImperativeHandle提供暴露给父组件的数据 ```js import { forwardRef, useImperativeHandle } from 'react'; ``` > 使用forward包裹好函数组件 ```jsx const AdminCaptcha = forwardRef((props, ref) => { /* 获取图片的base64 */ // 将 base64 的key值传给父组件 这样不会被覆盖 let [url, seturl] = useState("") const GetBase64Handler = async () => { const res = await getCaptchaApi() if (res.status === 200) { // 将后端传递过来的base64给到父组件使用 props.getKey(res.data.img) url = res.data.img seturl(() => { return url }) } } /* 点击图片进行刷新 */ const handler = () => { GetBase64Handler() } // 抛出该组件中的数据和方法 useImperativeHandle(ref, () => { return { initCaptchaFn } }) // 使用 useEffect 辅助函数发送请求 useEffect(() => { // 初始化执行 GetBase64Handler() }, []) return (
); }) ``` > useImperativeHandle 提供暴露的方法 ```jsx // 抛出该组件中的数据和方法 useImperativeHandle(ref, () => { return { initCaptchaFn } }) ``` ## 十、登录失败的时候清空Form表单项 ### 1. 第一种方法 使用 Form 实例 设置表单项的值 清空表单 ```jsx // 1. 获取表单实例 const [form] = Form.useForm(); // 2. 在 From 组件上
// 3. 清空表单项 form.setFieldsValue({ // 表单的数据为 "" })} ``` ### 2. 第二种方法使用 Ref 方法 重置表单 ```jsx // 1. 使用 Ref拿到表单的实例 const formref = useRef(); //2. 在 Form 表单上使用
// 3. 清空表单项 formref.current?.resetFields(); ``` ## 十一、配置Redux持久化 > 使用 persist ```shell npm install persist --save ```