react项目搭建-路由封装
router v6 路由统一管理与添加,对是否登录进行判断。
1.使用脚手架创建项目
新建一个文件夹 ,在文件夹内部打开命令行工具。
执行命令:npx create-react-app 项目名字
将项目放在开发工具中,打开项目终端运行项目(npm start / yarn start)
注:npx命令会帮助我们临时安装create-react-app包,然后初始化项目,完成之后会自动删除,不需要全局安装create-react-app。
1.1创建完成项目-目录

1.2 对项目目录进行简化
src保留App.js , index.css , index.js,其他的可以删除
修改index.js

// React: 框架的核心包
import React from 'react';
// ReactDOM: 专门做渲染相关的包
import ReactDOM from 'react-dom/client';
// 应用全局样式文件
import './index.css';
// 引入根组件
import App from './App'; // 渲染根组件App 到一个id为root的DOM节点上
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
//严格模式节点,useEffect执行机制
<React.StrictMode>
<App />
</React.StrictMode>
);
index.js
修改App,js

function App() {
return (
<div className="App">
APP页面
</div>
);
}
export default App;
App.js
运行结果

2.React-Router V6使用
安装插件
npm i react-router-dom -S

目前React Router v6是React Router的最新版本,所以安装就是v6。
2.1导入react-router-dom 修改index.js 内容

/*
* @description:
* @Author: Jay
* @Date: 2023-08-18 14:32:46
* @LastEditors: Jay
* @LastEditTime: 2023-08-18 14:48:22
*/
// React: 框架的核心包
import React from 'react';
// ReactDOM: 专门做渲染相关的包
import ReactDOM from 'react-dom/client';
// 应用全局样式文件
import './index.css';
// 引入根组件
import App from './App'; // 路由
import { BrowserRouter } from 'react-router-dom' // 渲染根组件App 到一个id为root的DOM节点上
const root = ReactDOM.createRoot(document.getElementById('root')); /*
! 去掉严格模式 页面不会加载2次
*/
root.render(
<BrowserRouter>
<Provider store={store}>
<App />
</Provider>
</BrowserRouter>
); /*
! 严格模式 页面会加载2次
*/
// root.render(
// //严格模式节点,useEffect执行机制
// <React.StrictMode>
// <BrowserRouter>
// <Provider store={store}>
// <App />
// </Provider>
// </BrowserRouter>
// </React.StrictMode>
// );
index.js
注:在严格模式下,React 的开发环境会刻意执行两次渲染,用于突出显示潜在问题。
StrictMode 是一个用来突出显示应用程序中潜在问题的工具。
2.2 创建项目其他文件夹

| 文件夹名字 | 介绍 |
|---|---|
| components | 全局组件 |
| router | 路由管理 |
| assets | 静态文件 |
| utils | 全局js |
| views | 项目页面 |
整个文件目录是以vue形式创建的。有些不太明白的可自行百度 vue目录结构解析,components,router,assets,view有详细的介绍。utils是开发者个人的定义。
2.3 React-Router V6版本常用路由
| 组件名 | 作用 | 说明 |
|---|---|---|
<Routers> |
一组路由 | 代替原有<Switch>,所有子路由都用基础的Router children来表示 |
<Router> |
基础路由 | Router是可以嵌套的,解决原有V5中严格模式,后面与V5区别会详细介绍 |
<Link> |
导航组件 | 页面中跳转使用 |
<Outlet/> |
自适应渲染组件 | 二级路由渲染组件 |
2.4 全局路由导入
修改App.js,导入路由列表 ,循环导入路由方法(判断该页面是否需要锻炼)

import React, { Suspense } from 'react'
import {
Route, Routes, Navigate
} from 'react-router-dom'
// 加载动画 组件
import Loading from './components/loading/loading'
//路由列表
import routesList from './router/index'
//循环路由
import { loopRouter } from "./router/loopRouter"
function App() {
return (
<>
{/* 这里Suspense是用于和React.lazy配合使用的 */}
<Suspense fallback={<Loading />}>
<Routes>
{/* 循环路由 */}
{loopRouter(routesList)}
{/* 找不到自己定义的根路由,默认跳转到 */}
<Route path="*" element={<Navigate to='/NotFound' replace={true} />} />
</Routes>
</Suspense>
</>
)
}
export default App
App.js
2.5全局路由封装
router文件夹下,创建index.js(路由列表),创建loopRouter.js (路由循环添加到页面)
路由列表:index.js
| 参数名 | 介绍 |
|---|---|
| path | 链接路径 |
| component | 对应的页面地址 |
| exact | 是否严格匹配 |
| children | 子路由,嵌套路由列表 |
| index | index属性来指定默认路由, path需要为空, |
注:index为children嵌套路由的第一个页面需要添加index参数为true。然后path参数为空。
index相当于vue的redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向。
children子路由页面使用


/*
* @description: 路由列表
* @Author: Jay
* @Date: 2023-08-18 15:25:28
* @LastEditors: Jay
* @LastEditTime: 2023-08-18 15:39:40
*/
import { lazy } from 'react'
const routesList = [
// 首页
{
path: '/',
component: lazy(() => import('../views/Home/Home.js')),
exact: true,
meta: {
title: '首页',
//是否需要登录
requireAuth: false
}
},
// 登录
{
path: '/LogIn',
component: lazy(() => import('../views/LogIn/LogIn.js')),
exact: true,
meta: {
title: '登录',
//是否需要登录
requireAuth: false
}
},
//二级路由
{
path: "/Basis",
// 使用懒加载的方法
component: lazy(() => import("../views/Basis/Basis.js")),
// 如果要求严格路径
exact: true,
//子路由
children: [
{
path: "",
// index属性来指定默认路由 path需要为空
index: true,
component: lazy(() => import("../views/BasisLevel/BasisLevel.js")),
exact: false,
meta: {
title: '二级路由1',
//是否需要登录
requireAuth: true
}
}, {
path: "BasisLevel2",
component: lazy(() => import("../views/BasisLevel2/BasisLevel2.js")),
exact: false,
meta: {
title: '二级路由2',
//是否需要登录
requireAuth: true
}
}
]
},
//404页面
{
path: '/NotFound',
exact: false,
component: lazy(() => import('../views/NotFound/NotFound.js')),
meta: {
title: '404',
//是否需要登录
requireAuth: false
}
}
]
export default routesList;
index.js
循环路由 loopRouter.js

/*
* @description: 路由循环 添加到页面
* @Author: Jay
* @Date: 2023-08-18 15:25:38
* @LastEditors: Jay
* @LastEditTime: 2023-08-18 15:25:46
*/
import {
Route, Navigate
} from 'react-router-dom' /* ----遍历一级路由----*/
const loopRouter = (routerList) => {
return routerList.map((item) => {
const { path, exact, children } = item;
return <Route
key={path}
exact={exact}
path={path}
element={<DomTitle item={item}> </DomTitle>}
>
{/* 遍历二级路由 有些页面没有二级 所以默认为空 [] */}
{SecondRouter(children || [])}
</Route >;
});
}; /* ----遍历二级路由----*/
const SecondRouter = (children) => {
return children.map(i => {
return <Route
key={i.path}
exact={i.exact}
path={i.path}
index={i.index}
element={<DomTitle item={i}></DomTitle>}
/>
})
} /* ----设置页面标题----*/
const DomTitle = ({ item }) => {
const { meta } = item
document.title = meta?.title || '';
return meta?.requireAuth ? <RequireAuth item={item} /> : <item.component />
} /* ---- 判断是否需要登录 ----*/
const RequireAuth = ({ item }) => {
// const token = sessionStorage.getItem('Authorization')
const token = '已登录'
if (token === null || token === '') {
return <Navigate to='/LogIn' replace={true} />
} else {
return <item.component />
}
} export { loopRouter, RequireAuth }
loopRouter.js
3.加载动画
components文件夹里创建loading文件夹
创建loading.js

/*
* @description: 加载动画 组件
* @Author: Jay
* @Date: 2022-12-06 09:39:25
* @LastEditors: Jay
* @LastEditTime: 2023-08-18 13:49:58
*/
import { Component } from "react";
import "./loading.css"
export default class Loading extends Component {
render() {
return (
// 加载动画
<div className="container_nomount">
<div className="loading">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<h2>Loading...</h2>
</div>
);
}
}
loading.js
创建loading.css

.container_nomount {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
box-sizing: border-box;
position: fixed;
width: 100%;
height: 100%;
overflow: hidden;
font-family: 'Poppins', sans-serif;
}
.container_nomount h2 {
margin-top: 20px;
font-size: 1.5em;
margin-block-start: 0.83em;
margin-block-end: 0.83em;
margin-inline-start: 0px;
margin-inline-end: 0px;
font-weight: bold;
}
.container_nomount .loading {
width: 80px;
height: 40px;
margin: 0 auto;
margin-top: -40px;
}
.container_nomount .loading span {
display: inline-block;
width: 8px;
height: 100%;
border-radius: 4px;
background: #1890ff;
animation: load 1s ease infinite;
}
@keyframes load {
0%,
100% {
height: 40px;
background: #ff3378;
}
50% {
height: 70px;
margin: -15px 0;
background: #1890ff;
}
}
.container_nomount .loading span:nth-child(2) {
animation-delay: 0.2s;
}
.container_nomount .loading span:nth-child(3) {
animation-delay: 0.4s;
}
.container_nomount .loading span:nth-child(4) {
animation-delay: 0.6s;
}
.container_nomount .loading span:nth-child(5) {
animation-delay: 0.8s;
}
loading.css
项目地址:https://github.com/jielov/react-loop-router
react项目搭建-路由封装的更多相关文章
- React项目搭建与部署
React项目搭建与部署 一,介绍与需求 1.1,介绍 1.1.1,React简介 React 是一个用于构建用户界面的 JAVASCRIPT 库. React主要用于构建UI,很多人认为 React ...
- 基于webpack的React项目搭建(一)
前言 工欲善其事,必先利其器.为了更好的学习React,我们先简要的把开发环境搭建起来.本文主要介绍使用webpack搭建React项目,如果你对React或es6的基础语法还不了解,建议先去学习学习 ...
- react项目搭建及webpack配置
1,配置webpack npm install -g webpack webpack的cli环境 npm install -g webpack-dev-se ...
- React项目搭建及依赖安装
一.前提 首先保证node.js已安装完成... 安装完成后,打开cmd命令行,输入 node -v 和 npm -v 来查看版本号,如果显示则安装完成. 二.安装react脚手架 在cmd命令行中输 ...
- 基于webpack的React项目搭建(三)
前言 搭建好前文的开发环境,已经可以进行开发.然而实际的项目中,不同环境有着不同的构建需求.这里就将开发环境和生产环境的配置单独提取出来,并做一些简单的优化. 分离不同环境公有配置 不同环境虽然有不同 ...
- 基于webpack的React项目搭建(二)
前言 前面我们已经搭建了基础环境,现在将开发环境更完善一些. devtool 在开发的过程,我们会经常调试,so,为了方便我们在chrome中调试源代码,需要更改webpack.config.js,然 ...
- react 项目搭建
1.首先运行环境-node是必须的,需要下载安装node的运行环境: 2.安装好了node之后,自然的就有了npm: 3.npm install -g creact-react-app/全局安装cre ...
- react项目搭建
1.下载安装node.js,需要node.js环境. 2.经过挑选,决定选择creat-react-app这个项目脚手架,然后输入指令安装 $ npm install -g crea ...
- React项目搭建基于Karma的CI环境
简介 在浏览Github的时候是否经常看到这样的CI图标呢? 本文即为介绍如何为基于React的项目配置CircleCI的自动化测试环境 源码在此 本地实现 项目依赖如下: "devDepe ...
- React项目搭建(脚手架)
首先我们需要安装node环境:download nodejs:https://i.cnblogs.com/EditPosts.aspx?opt=1 找到你需要的版本和系统安装包下载并安装. 这时候你可 ...
随机推荐
- 2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出。 每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼, 并且每条鱼吃比自己小的鱼的事件是同时发生的。 返回多少轮之
2022-05-27:现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出. 每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼, 并且每条鱼吃比自己小的鱼的事件是同时发生的. 返回多少轮之 ...
- vue全家桶进阶之路43:Vue3 Element Plus el-form表单组件
在 Element Plus 中,el-form 是一个表单组件,用于创建表单以便用户填写和提交数据.它提供了许多内置的验证规则和验证方法,使表单验证更加容易. 使用 el-form 组件,您可以将表 ...
- transaction.atomic装饰器
from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic imp ...
- Django-5:前端模板路径设定TEMPLATES DIRS和调用
前端模板路径设定:'DIRS': [BASE_DIR / 'templates'] TEMPLATES = [ { 'BACKEND': 'django.template.backends.djang ...
- ComboBox1 绑定手动创建的DataTable
'************************************************** '*过程名称:DT_PAFORMAL '*功能说明:员工类别 '**************** ...
- 深入 Hyperf:HTTP 服务启动时发生了什么?
当我们创建 Hyperf 项目之后,只需要在终端执行 php bin/hyperf.php start 启动命令,等上几秒钟,就可以看到终端输出的 Worker 进程已启动,HTTP 服务监听在 95 ...
- IntelliJ IDEA 的安装
IntelliJ IDEA 的安装 安装之前参考Win10环境配置(二) --Java篇 1. 下载软件 官网: IntelliJ IDEA 分两个版本,学习Java下Community版 2.安装 ...
- iOS气泡提示工具BubblePopup的使用
在平时的开发中,通常新手引导页或功能提示页会出现气泡弹窗来做提示.如果遇到了这类功能通常需要花费一定的精力来写这么一个工具的,这里写了一个气泡弹窗工具,希望能帮你提升一些开发效率. 使用方法 ...
- 读少写多的条件下 ConcurrentHashMap 和 ReadWriteLock 的选择
场景是这样的:两个对象往一个 Map 里循环写入,另外一个对象偶尔读一次,写的频率比读的频率高很多.希望实现的是读的时候暂停写入.CocurrentHashMap 和 ReadWriteLock 各有 ...
- 逆向之Ja3指纹学习
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! tls tls实际上前身就 ...