React-router-dom v6 无限级嵌套路由的实现
话不多说直接上代码
以下代码为了节省空间,有简写
入口文件 index.js
root.render(
<BrowserRouter>
<App />
</BrowserRouter>
);
App组件
import React, {
ReactNode, useEffect } from 'react'
import Layout from './layout'
import {
Routes, Route, useNavigate } from "react-router-dom";
import NoMatch from './views/NoMatch'
import {
HasAuthRoutes, IRoute } from './router';
import Login from './views/Login';
import AuthPage from './views/AuthPage';
import NoAuthPage from './views/NoAuthPage';
const getRouteData = (items: IRoute[]): ReactNode => {
return items.map(r => {
if (r.children && r.children.length > 0) {
return (<Route index={
r.path == '/'} key={
r.key} element={
r.component}>
{
getRouteData(r.children)}
</Route>)
}
return (<Route index={
r.path == '/'} key={
r.key} path={
r.path} element={
r.component}></Route>)
})
}
export default function App() {
return (
<>
<AuthPage>
<Routes>
<Route path="/" element={
<Layout />}>
{
getRouteData(HasAuthRoutes)}
<Route path="*" element={
<NoMatch />} />
</Route>
</Routes>
</AuthPage>
<NoAuthPage>
<Routes>
<Route path="/login" element={
<Login />} />
</Routes>
</NoAuthPage>
</>
)
}
Layout.tsx
import React, {
Suspense, useEffect, useState } from 'react';
import {
LaptopOutlined, NotificationOutlined, UserOutlined } from '@ant-design/icons';
import {
Breadcrumb, Layout, Menu, MenuProps } from 'antd';
import {
IRoute, HasAuthRoutes, NoAuthRoutes } from '../router'
import {
findkeyByPath, findPathByKey } from '../utils'
import {
Outlet, Link, useLocation } from 'react-router-dom'
import {
useNavigate } from 'react-router'
const {
Header, Content, Sider } = Layout;
const getItems = (items: IRoute[]): MenuProps['items'] => items.map(r => ({
// label: <Link to={r.key || ''}>{r.title}</Link>,
label: r.title,
key: r.key,
children: r.children ? getItems(r.children) : null,
}))
const findKey = () : {
acKeys: string[], openKeys: string[] } => {
let pathname = window.location.pathname
let currentRoute = findkeyByPath(pathname