react-router-dom v6版本如何支持动态拼接地址加载?

router.ts

import React, { lazy } from 'react';
import UserLayout from "@/layout/UserLayout"
import BasicLayout from "@/layout/BasicLayout"

export type routerInterType = {
    name?: string,
    path?: string,
    exact?: boolean,
    index?: boolean,
    isLazy?: boolean,
    element?: any, // 渲染的组件
    caseSensitive?: boolean,
    show?: boolean, // 是否展示在菜单 true表示显示
    children?: routerInterType[]
}

const _router: routerInterType[] = [
    {
        name: "用户管理",
        path: "/user",
        element: UserLayout,
        show: false,
        children: [
            {
                name: "注册",
                path: "/user/register",
                element: lazy(() => import("@/pages/user/register"))
            },
            {
                name: "修改密码",
                path: "/user/changePassword",
                element: lazy(() => import("@/pages/user/changePassword"))
            },

            {
                name: "登录",
                path: "/user/*",
                index: true,
                element: "../pages/user/login"
            },
        ]
    },
    {
        path: "/home",
        name: "主页",
        element: BasicLayout,
        show: true
    },
    {
        name: "404",
        path: "*",
        show: false,
        element: "@/layout/UserLayout",
    }
]

const generateRouter = (routers: routerInterType[]): routerInterType[] => {
    return routers.map((item: routerInterType) => {
        
        if (typeof item.element === "string") {
            item.element = lazy(() => require(item.element))
        }
        else {
            item.element = React.createElement(item.element);
        }
        if (item.children) {
            item.children = generateRouter(item.children);
        }
        return item
    })
}

const routers = generateRouter(_router)


export {
    routers,
    generateRouter,
}

app.tsx

import React, { FC, Provider } from 'react';
import { BrowserRouter, useRoutes, Route } from "react-router-dom"
import { routers, } from "@/router"
import "@/easystory"
import './App.less';
import Nprogress from "@/components/nprogress"

const App: FC = () => {
    // useRoutes会自动序列化routers的tree结构
    console.log(routers)
    const UseRoutesHook = () => useRoutes(routers)
    return <BrowserRouter>
        <React.Suspense fallback={<Nprogress></Nprogress>}>
            <UseRoutesHook></UseRoutesHook>
        </React.Suspense>
    </BrowserRouter>
};

export default App;

如router.js所示,在转换函数中使用lazy(()=>import('xxx'))就无法使用了控制台报错image.png
看代码该路径的模块已经被createElement,但是进入到登录的路由时却提示cannot find module,有碰到类似的错误的吗。
app.tsx打印的路由结构
8e565ab23e87ba8acee978288497349.png

阅读 1.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题