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写法,组件资源已上传可以免费查看。
这里还有优化空间可以不用两个组件,大家可以自行优化。
