ReactV6 useRoutes 配置懒加载及路由拦截

2,188 阅读1分钟

前言

在v5和v6的路由配置之间有比较大的区别下文主要是针对useRoutes函数式写法,下文主要是TS写法如不是删除对应即可。

router/setting.js

import React, { lazy } from "react";
// 声明类型
export interface SyncRoute {
  path: string;
  component: React.LazyExoticComponent<any>;
  children?: Array<SyncRoute>;
  meta?: {
    title?: string;
    needLogin?: boolean;
  };
}

const RouteTable: Array<SyncRoute> = [
  {
    path: "/",//一级路由
    component: lazy(() => import("@/views/index")),
    children: [//二级路由
      {
        path: "",//为空则默认显示该路由
        component: lazy(() => import("@/views/home/index/index")),
      },
      {
        path: "index",
        component: lazy(() => import("@/views/home/index/index")),
        meta: {
          title: "首页",
        },
      }
      }
    ],
  },
  {
    path: "*",//404页面
    component: lazy(() => import("@/components/notFound")),
  },
];

export default RouteTable;

router/index.js

import { Suspense, useEffect } from "react";
import { useRoutes, RouteObject, useNavigate } from "react-router-dom";
import { Spin } from "antd";

import RouteTable, { SyncRoute } from "./setting";

//懒加载处理
const syncRouter = (routes: Array<SyncRoute>): RouteObject[] => {
  let mRouteTable: RouteObject[] = [];
  routes.forEach((route) => {
    mRouteTable.push({
      path: route.path,
      element: (
        <Suspense
          fallback={
            <div className="h-full flex justify-center items-center">
              <Spin tip="Loading" size="large" />
            </div>
          }
        >
          <RequireAuth route={route}>
            <route.component />
          </RequireAuth>
        </Suspense>
      ),
      children: route.children && syncRouter(route.children),
    });
  });
  return mRouteTable;
};
//路由拦截
const RequireAuth = (props: { route: any; children: any }) => {
  if (props?.route?.meta?.title) {
    document.title = props.route.meta.title;
  }

  if (props?.route?.meta?.needLogin) {
    // 看是否登录
    const navigate = useNavigate();
    useEffect(() => {
     navigate('/');
    })
  }
  return props.children;
};

export default () => useRoutes(syncRouter(RouteTable)); //暴露为一个函数