首页 > 其他分享 >react项目搭建-路由封装

react项目搭建-路由封装

时间:2023-08-19 10:22:30浏览次数:35  
标签:index 封装 App js react import 路由

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>
      <App />
  </BrowserRouter>
);

/*
 ! 严格模式 页面会加载2次
*/
// root.render(
//   //严格模式节点,useEffect执行机制
//   <React.StrictMode>
//     <BrowserRouter>
//         <App />
//     </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需要为空,

注:indexchildren嵌套路由的第一个页面需要添加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

标签:index,封装,App,js,react,import,路由
From: https://www.cnblogs.com/lovejielive/p/17641195.html

相关文章

  • webman:配置路由(v1.5.7)
     一,官方文档地址:https://www.workerman.net/doc/webman/route.html二,php代码:config/route.php1234567891011121314151617181920<?php useWebman\Route; //指定默认页面Route::get('/',[app\controller\IndexController::class......
  • 面向对象开发的封装
    封装被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使程序员实现所需级别的抽象。封装使用 访问修饰符 来实现。一个 访问......
  • 面向对象——封装
    什么是封装    面向对象编程是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码......
  • 笔记整理--C语言--失落的C语言结构体封装艺术 - 博客 - 伯乐在线——转载
    失落的C语言结构体封装艺术-博客-伯乐在线转载1.谁该阅读这篇文章本文是关于削减C语言程序内存占用空间的一项技术——为了减小内存大小而手工重新封装C结构体声明。你需要基本的C语言的基本知识来读懂本文。如果你要为内存有限制的嵌入式系统、或者操作系统内核写代码,那......
  • 谈谈Vue3中的ref和reactive
    一、是什么?ref和reactive是Vue3中用来实现数据响应式的API一般情况下,ref定义基本数据类型,reactive定义引用数据类型(我喜欢用它来定义对象,不用它定义数组,原因后面讲)我理解的ref本质上是reactive的再封装二、先聊reactivereactive定义引用数据类型(以对象和数组举例),它能够将复......
  • 4G工业路由器的功能与选型!详解工作原理、关键参数、典型品牌
    随着工业互联网的发展,4G工业路由器得到越来越广泛的应用。但是如何根据实际需求选择合适的4G工业路由器,是许多用户关心的问题。为此,本文将深入剖析4G工业路由器的工作原理、重要参数及选型要点,并推荐优质的品牌及产品,以提供选型参考。  一、4G工业路由器的工作原理4G......
  • React请求机制优化思路
    说起数据加载的机制,有一个绕不开的话题就是前端性能,很多电商门户的首页其实都会做一些垂直的定制优化,比如让请求在页面最早加载,或者在前一个页面就进行预加载等等。随着react18的发布,请求机制这一块也是被不断谈起,并且在后续其实也给出了明确的方向。假如我们页面中有三个组件C1......
  • 实现通用路由菜单的一种方式
    将路由数组引入后进行遍历,自行迭代,即可展示需要的菜单选项<a-menu-itemv-for="iteminroutes":key="item.path">{{item.name}}</a-menu-item>在通用布局中使用route-view渲染实际的页面内容,更加动态也更加灵活<a-layout-contentclass="center">......
  • ESXI8.0 安装OpenWrt高大全版本作为旁路由
    安装esir-openwrt的高大全版当然是为了旅游了,本文只讲述我们已经有ESXI服务器,如何在自己的ESXI上安装esir大神openwrt高大全的版本;后面的使用,我相信聪明的你,一看就会了。 一、准备材料:1.镜像下载:01-LeanCodex86_64Firmware|固件-GoogleDrive 无法通过谷歌网盘下......
  • React面试1
    1.什么是虚拟DOM?虚拟DOM是真实DOM在内存中的表示,ul的表示形式保存在内存中,并且与实际的DOM同步,这是一个发生在渲染函数被调用和元素在屏幕上显示的步骤,整个过程被称为调和2.类组件和函数组件之间的区别是什么?类组件可以使用其他特性,如状态和生命周期钩子,并且他有this函数组件只......