路由守卫
const AuthRouter = (props: { children: JSX.Element }) => {
const { pathname } = useLocation();
const route = searchRoute(pathname, rootRouter);
if (!route.meta?.requiresAuth) return props.children;
const token = store.getState().global.token;
if (!token) return <Navigate to="/login" replace />;
const dynamicRouter = store.getState().auth.authRouter;
const staticRouter = [ "/home/index", "/403"];
const routerList = dynamicRouter.concat(staticRouter);
if (routerList.indexOf(pathname) == -1) return <Navigate to="/403" />;
return props.children;
};
路由懒加载
import React, { Suspense } from "react";
import { Spin } from "antd";
const lazyLoad = (Comp: React.LazyExoticComponent<any>): React.ReactNode => {
return (
<Suspense
fallback={
<Spin
size="large"
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
height: "100%"
}}
/>
}
>
<Comp />
</Suspense>
);
};
export default lazyLoad;
import lazyLoad from "@/routers/utils/lazyLoad";
{
path: "/assembly/selectIcon",
element: lazyLoad(React.lazy(() => import("@/views/assembly/selectIcon/index"))),
meta: {
requiresAuth: true,
title: "Icon 选择",
key: "selectIcon"
}
},
Usage
import { useState, useEffect } from "react";
import { ConfigProvider } from "antd";
import { setLanguage } from "@/redux/modules/global/action";
import { HashRouter } from "react-router-dom";
import AuthRouter from "@/routers/utils/authRouter";
import Router from "@/routers/index";
import zhCN from "antd/lib/locale/zh_CN";
import enUS from "antd/lib/locale/en_US";
import i18n from "i18next";
import "moment/dist/locale/zh-cn";
const getBrowserLang = () => {
let browserLang = navigator.language ? navigator.language : navigator.browserLanguage;
let defaultBrowserLang = "";
if (browserLang.toLowerCase() === "cn" || browserLang.toLowerCase() === "zh" || browserLang.toLowerCase() === "zh-cn") {
defaultBrowserLang = "zh";
} else {
defaultBrowserLang = "en";
}
return defaultBrowserLang;
};
const App = (props: any) => {
const { language, assemblySize, themeConfig, setLanguage } = props;
const [i18nLocale, setI18nLocale] = useState(zhCN);
const setAntdLanguage = () => {
if (language && language == "zh") return setI18nLocale(zhCN);
if (language && language == "en") return setI18nLocale(enUS);
if (getBrowserLang() == "zh") return setI18nLocale(zhCN);
if (getBrowserLang() == "en") return setI18nLocale(enUS);
};
useEffect(() => {
i18n.changeLanguage(language || getBrowserLang());
setLanguage(language || getBrowserLang());
setAntdLanguage();
}, [language]);
return (
<HashRouter>
<ConfigProvider locale={i18nLocale} componentSize={assemblySize}>
<AuthRouter>
<Router />
</AuthRouter>
</ConfigProvider>
</HashRouter>
);
};