# 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
```