React中无限级嵌套路由的实现(RRD-V6)

本文介绍了如何在React中利用React-router-dom v6进行无限级嵌套路由的设置,包括入口文件index.js、App组件、Layout.tsx、Utils.ts和routes.ts的配置。同时,通过自定义hooks在layout.tsx、hooks.tsx和utils.tsx中实现了菜单自动高亮的功能。
摘要由CSDN通过智能技术生成

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
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值