当前位置: 首页 > news >正文

react 路由管理自定义路由组件(React动态生成路由)仿Vue-router写法

前言:
原生态React 路由控制采用的react-router-dom,当天umi是单独封装处理。

需求:
可以根据登录后后端数据返回 控制路由
1.常规写法:
react 会默认在Roots.jsx里引用Routes.jsx

import { ConfigProvider, Spin, Layout, Space, message }from 'antd'
import Routes from './Routes'
	//省略ConfigProvider antd全局配置
 return <ConfigProvider> 
	  <Layout> 
	  	   <Routes  />
	  </Layout> 
  </ConfigProvider>

2.Routes.jsx 组件

import { Route, Switch, Redirect, useLocation } from 'react-router-dom'

const Routes = ()=>{


	return   <Switch> 
	//这里丢一些不用控制的路由例如登录,修改密码等
	   <Route path="/login" component={Login} />
	     <Route path="/forget-password" component={ForgetPassword} />
	//重点来了 动态生成路由
	{loggedin ? (           (routeList)?.map((item) => getRoute(item)) ) :null}
	//找不到路由访问的是NotFound页面
	 <Route component={NotFound} />
 </Switch>
}

3.动态路由 routeList

import React, { lazy} from 'react'
const routeList = [
	    {
        path: '/home',
        component: lazy(() => import('./layout')),
        permissionId: 'all',
        children: [
            {
                path: '/',
                component: lazy(() => import('./HomePage')),
                permissionId: 'all',
            },
        ],
    },
    {
        path: '/test',
        component: lazy(() => import('./layout')),
        id: '1',
        permissionId: 119,
        // permissionId:'all',
        children: [
            {
                path: '/test1',
                component: lazy(() => import('./CustomSales/list')),
                permissionId: 121,
            },
            {
                path: '/test2',
                component: lazy(() => import('./CustomSales/list')),
                permissionId: 122,
            },
            //自定义文件夹
            {
                path: '/test3',
                component: lazy(() => import('./layout')),
                permissionId: 137,
                //文件夹列表
                children: [
                    {
                        path: '/',
                        component: lazy(() => import('./CustomSales/customFolderClient')),
                        permissionId: 139,
                    },
                    //文件夹详情
                    {
                        path: '/:queryId',
                        component: lazy(() => import('./CustomSales/list')),
                        permissionId: 140,
                    },
                ],
            },
            //共享文件夹
            {
                path: '/test4',
                component: lazy(() => import('./layout')),
                permissionId: 138,
                //文件夹列表
                children: [
                    {
                        path: '/',
                        component: lazy(() => import('./CustomSales/shareFolderClient')),
                        permissionId: 147,
                    },
                    //文件夹详情
                    {
                        path: '/:queryId',
                        component: lazy(() => import('./CustomSales/list')),
                        permissionId: 150,
                    },
                ],
            },
            {
                path: '/detail/:id',
                component: lazy(() => import('./CustomSalesDetail/detail')),

                permissionId: 126,
            },
        ],
    },
        {
        path: '/',
        // component: lazy(() => import('./HomePage')),
        component: () => <Redirect to="/homepage" />,
        permissionId: 'all',
    },
]
注意有两个地方:
1. path: '/'  一定放最后不然会拦截前面的路由 (Switch)原因
2. 后端返回的component是一个字符串路由,前端需要lazy懒加载组件包裹起来

3.getRoutes组件

    const getRoute = (value) => {
        return (
            <PrivateRoute
                key={value.path}
                path={value.path}
                component={value.component}
                child={value.children}
            />
        )
    }```

4.PrivateRoute组件(控制一级登录权限问题),layout组件仿照Vue-Router写法,组件资源已上传可以免费查看。
这里还有优化空间可以不用两个组件,大家可以自行优化。



相关文章:

  • AcWing 1140. 最短网络(最小生成树问题)
  • 【MySQL基础】用户自定义函数(UDF)入门
  • 矩阵对角线元素的和 - 简单
  • 科技快讯 | 全球首个通用智能人“通通”2.0正式发布;X 平台被曝遭遇严重数据泄露;智谱发布Agent产品AutoGLM沉思 可以像人类一样
  • leetcode刷题日记——接雨水
  • 4.1学习总结 拼图小游戏+集合进阶
  • Oracle迁移达梦遇中断?试试SQLark的断点续迁功能!
  • 代码随想录算法训练营第三十四天 | 62.不同路径 63.不同路径II 343.整数拆分
  • Springboot集成Dubbo和Zookeeper框架搭建
  • 基于 Vue + Django + MySQL 实现个人博客/CMS系统
  • 基于单片机的音乐播放器系统设计
  • FPGA学习-基于 DE2-115 板的 Verilog 分秒计数器设计与按键功能实现
  • 第一章 EDA技术概述
  • NLP高频面试题(三十)——LLama系列模型介绍,包括LLama LLama2和LLama3
  • AI原生应用爆发:从通用大模型到垂直场景的算力重构
  • C++ --- map和set的使用
  • 【Linux】高性能网络模式:Reactor 反应堆模式
  • 搞 PostgreSQL多才多艺的人--赵渝强 《PG数据库实战派》
  • 【容器】设备上没有剩余空间的错误排查处理
  • flutter WEB端启动优化(加载速度,加载动画)
  • 巴总理召开国家指挥当局紧急会议
  • 三星“七天机”质保期内屏幕漏液被要求自费维修,商家:系人为损坏
  • 牛市早报|国家发改委:今年将推出约3万亿元优质项目,支持民营企业参与
  • 《2025城市青年旅行消费报告》发布,解码青年出行特征
  • 常州市委原常委、组织部部长陈翔调任江苏省民宗委副主任
  • 云南临沧一行贿案金额认定比受贿案多41万,重审时检方变更金额起诉