React通用后台模板

本文档详细介绍了如何从零开始构建一个React通用后台模板,包括项目初始化、配置SCSS、引入Antd Design、React路由配置、Redux状态管理和数据交互等步骤,帮助开发者快速搭建前端框架。
摘要由CSDN通过智能技术生成

一、项目初始化

1、创建项目

环境

npm init vite  // 创建项目

打开package.json,参考以下各模块版本:

"dependencies": {    
    "react": "^18.2.0",    
    "react-dom": "^18.2.0",    
    "react-redux": "^7.2.8",    
    "react-router-dom": "^6.3.0",    
    "redux": "^4.1.2"
},
"devDependencies": {
   "vite": "^4.4.5", // 解决vite版本过高,下载包文件出错
   "redux-thunk": "^2.4.2",  // 需要redux-thunk版本与redux相匹配
}

下载后进入到项目文件夹,安装package.json中的包:

npm i

尝试更改package.json启动命令:

"scripts": {    
    "dev": "vite --host --port 3002",    
    "build": "tsc && vite build",    
    "preview": "vite preview"
}

2、项目目录初始化

删除 src 下除了main.tsxApp.tsx的其他文件;主文件src/main.tsx修改成:

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
ReactDOM.createRoot(document.getElementById('root')!).render(  
    <React.StrictMode>    
        <App />  
    </React.StrictMode>
)

App.tsx文件修改成:

import { useState } from 'react'
function App() {  
const [count, setCount] = useState(0)  
    return (    
        <div className="App"> 
            顶级组件    
        </div>  
    )
}

export default App

3、样式初始化

reset-css比Normalize.css更直接,干净利落去除默认样式,更适合在企业里的场景,所以用reset-css,而不用Normalize.css】

npm i reset-css

src/main.tsx中引入reset-css

import React from 'react'
import ReactDOM from 'react-dom/client'
import "reset-css"
import App from './App'

ReactDOM.createRoot(document.getElementById('root')!).render(  
    <React.StrictMode>    
        <App />  
    </React.StrictMode>
)

4、scss的安装和初步使用

安装sass   vite中很方便,loader这些都不用自己配置,只需要安装好即可使用npm i --save-dev sass

src下新建 assets/styles/global.scss

$color:#eee;
body{
    // 禁止选中文字    
    user-select:none;    
    background-color: $color;
}
img{    
    // 禁止拖动图片    
    -webkit-user-drag:none;
}

main.tsx中引入全局样式

import React from 'react'
import ReactDOM from 'react-dom/client'
import "reset-css"
import "./assets/styles/global.scss"
import App from './App'


ReactDOM.createRoot(document.getElementById('root')!).render(  
    <React.StrictMode>    
        <App />  
    </React.StrictMode>
)

5、配置项目路径别名

// vite.config.ts
import path from 'path'

export default defineConfig({  
    plugins: [react()],  
    resolve:{    
        alias:{      
            "@":path.resolve(__dirname,'./src')    
        }  
    }
})

这时候引入的会path模块报红,但其实我们已经有node,所以就已经有path模块,只是缺少ts的一些声明配置。所以需要安装关于node这个库的ts声明配置

npm i -D @types/node

安装成功就没有报红了,如果import后面的path报红,就把引入换成 import * as path from'path';

配置路径别名的提示

虽然现在路径别名已经有了,但是在文件中输入@是没有提示路径的需要我们在tsconfig.json中:添加两项配置

"compilerOptions": {
    ...    
    "baseUrl": "./",    
    "paths": {      
        "@/*": [
            "src/*"      
        ]    
    }
},

6、scss模块化

src下新建components文件夹,components文件夹下新建Comp1文件夹,新建index.tsx和comp1.scss

import "./comp1.scss"
function Comp() {
  return (
    <div className="box">
        <p>这是Comp1里面的组件</p>
    </div>
 )
}
export default Comp

src/components/Comp1/comp1.scss中:

.box{
    color:red
}

components文件夹下新建Comp2文件夹,新建index.tsx:

// !!!注意,在Comp2组件中不引入上面的comp1.scss样式
function Comp() {
  return (
    <div className="box">
        <p>这是Comp2里面的组件</p>
    </div>
 )
}
export default Comp

在App.tsx中使用这两个组件:

import { useState } from 'react'
import Comp1 from "./components/Comp1"
import Comp2 from "./components/Comp2"
function App() {
  const [count, setCount] = useState(0)
  return (
    <div className="App">
      <Comp1></Comp1>
      <Comp2></Comp2>
    </div>
 )
}
export default App

此时会发现,Comp2/index.tsx中没有引入comp1.scss竟然也有box的样式!!!

说明Comp1的引入comp1.scss就是全局引入,这不是我们要的现象,所以这时候我们就需要用到模块 化css

scss的模块化

src/components/Comp1/comp1.scss 改名为 comp1.module.scss

在Comp1/index.sx中:

// 修改引入的语句
import styles from "./comp1.module.scss";
function Comp() {
  return (
      // 修改类名编程模块化写法
    <div className={styles.box}>
        <p>这是Comp1里面的组件</p>
    </div>
 )
}
export default Comp

这样就不会影响其他组件了。注意:styles.box 的 box 在 .module.scss 文件中只能是类名,标签名字不起作用

7、Antd Design初步引入

安装Antd Design

npm install antd --save

安装图标所需要的模块

npm install @ant-design/icons --save

App组件中引入即可使用:

import { useState } from 'react'
import { Button } from 'antd';
import {FastBackwardOutlined} from "@ant-design/icons"
import 'antd/dist/antd.css'; // or 'antd/dist/antd.less'
function App() {
  const [count, setCount] = useState(0)
  return (
    <div className="App">
     顶级组件
      <Button  type="primary">按钮文字</Button>
      <FastBackwardOutlined style={
  { fontSize: '40px', color: '#08c' }}/>
    </div>
 )
}
export default App

ps: 如果你的vscode不兼容jsx语法提示:请打开vscode配置文件,补充:

"emmet.triggerExpansionOnTab": true,
    "emmet.includeLanguages": {
        "javascript": "javascriptreact"
}

8、React路由

第一种配置方案(旧项目中的写法)

【1. 准备界面】首先src下创建views文件夹,views文件夹下创建Home.tsxAbout.tsx,大致代码如 下:

function View() {
    return (
        <div className="home">
            <p>Home</p>
        </div>
   )
}
export default View

【2. 配置对应关系】/src下新建router文件夹,再进去新建index.tsx

import App from "../App"
import Home from "../views/Home"
import About from "../views/About"
import {BrowserRouter,Routes,Route} from "react-router-dom"
// 两种路由模式的组件: BrowserRouter ( History模式 ) , HashRouter( Hash模式 )
// const baseRouter = () => {
//     return ()
// }

// 以上写法可以简写为:
const baseRouter = () => (
    <BrowserRouter>
        <Routes>
            <Route path="/" element={<App/>}>
                <Route path="/home" element={<Home/>}></Route>
                <Route path="/about" element={<About/>}></Route>
            </Route>
        </Routes>
    </BrowserRouter>
)
export default baseRouter

【3. 替换顶级组件】在/src/main.tsx中把顶级组件App替换为这个路由对象:

// 引入路由对象
import Router from './router';
ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <Router />
  </React.StrictMode>
)

【4. 添加窗口组件】/src/App.tsx中,使用 组件作为占位符组件:

import {Outlet} from "react-router-dom";
function App() {
  //const [count, setCount] = useState(0)
  return (
    <div className="App">
     {/* 占位符组件,窗口,有点类似于Vue中的 router-view */}
      <Outlet />
    </div>
 )
}
export default App

这样就可以在浏览器中访问,下面的地址看到页面了:

        http://localhost:3002/home

        http://localhost:3002/about

【5. 编程式导航--设置菜单点击跳转

/src/App.tsx中,使用 组件进行跳转:

import {Outlet,Link} from "react-router-dom"
...
<div className="App">
    <Link to="/home">home</Link> |
    <Link to="/about">about</Link>
   {/* 占位符组件,窗口,有点类似于Vue中的 router-view */}
    <Outlet />
</div>

6. 配置重定向

/src/router/index.tsx中:

import {BrowserRouter,Routes,Route,Navigate} from "react-router-dom"
...
<Route path="/" element={<App/>}>
   {/* 配置 用户访问/的时候,重定向到/home路径 */}
    <Route path="/" element={<Navigate  to="/home" />}></Route>
   ...
</Route>

路由表的写法

和上面一样,在这里模拟vue中的home和about两个组件展示

【1、准备界面】在上面已经完成

【2、配置对应关系】/src/router/index.tsx中:

import Home from "../views/Home"
import About from "../views/About"
// Navigate 重定向组件
import {Navigate} from "react-router-dom"
const routes = [
   {
        path:"/",   //重定向到home
        element:<Navigate  to="/home" />,
   },
   {
        path:"/home",
        element:<Home/>,
   },
   {
        path:"/about",
        element:<About/>,
   }
    // { path: "*", element: <Navigate to="/" /> }, 
]
export default routes

【3、路由组件的添加】在/src/main.tsx中在顶级组件App外层添加路由组件:

...
// 路由
import { BrowserRouter } from "react-router-dom"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

26:28

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值