• react_13


    React Router

    //-dom代表给浏览器应用使用的

    npm install react-router-dom

    • 目前版本是 "react-router-dom": "^6.18.0"

    • 使用

      新建文件 src/router/MyRouter.tsx

      1. import { Navigate, RouteObject, useRoutes } from "react-router-dom";
      2. import { Route } from "../model/Student";
      3. import A8Login from "../pages/A8Login";
      4. import A8Main from "../pages/A8Main";
      5. import A8NotFound from "../pages/A8NotFound";
      6. import { lazy } from "react";
      7. import RoutesStore from "../store/RoutesStore";
      8. import { observer } from "mobx-react-lite";
      9. export function load(name: string) {
      10. //lazy方法可以根据字符串获得字符串组件对应着的组件标签
      11. const Page = lazy(() => import(`../pages/${name}`));
      12. console.log(Page);
      13. return <Page>Page>;
      14. }
      15. function MyRouter() {
      16. console.log(RoutesStore.routes)
      17. const router = useRoutes(RoutesStore.routes);
      18. return router;
      19. }
      20. //注意导入 router 对象时,用 observer 做了包装,这样能够在 store 发生变化时重建 router 对象
      21. export default observer(MyRouter)

      index.tsx 修改为

      1. import ReactDOM from "react-dom/client";
      2. import "./index.css";
      3. import reportWebVitals from "./reportWebVitals";
      4. import { ConfigProvider } from "antd";
      5. import zhCN from "antd/es/locale/zh_CN";
      6. import MyRouter from "./router/MyRouter";
      7. import { BrowserRouter } from "react-router-dom";
      8. const root = ReactDOM.createRoot(
      9. document.getElementById("root") as HTMLElement
      10. );
      11. root.render(
      12. <ConfigProvider locale={zhCN}>
      13. <BrowserRouter>
      14. <MyRouter>MyRouter>
      15. BrowserRouter>
      16. ConfigProvider>
      17. );
      18. // If you want to start measuring performance in your app, pass a function
      19. // to log results (for example: reportWebVitals(console.log))
      20. // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
      21. reportWebVitals();

      A8Main 的代码

      1. import {
      2. DownCircleOutlined,
      3. MenuFoldOutlined,
      4. VerticalAlignTopOutlined,
      5. } from "@ant-design/icons";
      6. import { Button, Layout, Menu } from "antd";
      7. import { ItemType } from "antd/es/menu/hooks/useItems";
      8. import { Link, Navigate, Outlet, useNavigate } from "react-router-dom";
      9. import Icon from "../store/Icon";
      10. import StudentStore from "../store/StudentStore";
      11. import RoutesStore from "../store/RoutesStore";
      12. import { observer } from "mobx-react-lite";
      13. import { useEffect } from "react";
      14. function A8Main() {
      15. const items: ItemType[] = [
      16. {
      17. label: <Link to="/student">学生管理Link>,
      18. key: 1,
      19. icon: <DownCircleOutlined />,
      20. },
      21. {
      22. label: <Link to="/teacher">教师管理Link>,
      23. key: 2,
      24. icon: <VerticalAlignTopOutlined />,
      25. },
      26. {
      27. label: "用户管理",
      28. key: 3,
      29. icon: <MenuFoldOutlined />,
      30. children: [
      31. {
      32. label: "功能一",
      33. key: 31,
      34. icon: <Icon name="PicLeftOutlined">Icon>,
      35. },
      36. {
      37. label: "功能二",
      38. key: 32,
      39. icon: <Icon name="BorderHorizontalOutlined">Icon>,
      40. },
      41. ],
      42. },
      43. ];
      44. const nav = useNavigate();
      45. //点击注销按钮,清空localStorage里面和state数据,跳转到登录页面
      46. function onClick() {
      47. RoutesStore.reset();
      48. nav("/login");
      49. }
      50. //useEffect()的执行时机是先生成了jsx代表,然后执行了副作用,然后再渲染,正在渲染的时候执行了跳转,所以看到
      51. //主页一闪而过,
      52. /* useEffect(() => {
      53. if (RoutesStore.username === "") {
      54. nav("/login");
      55. }
      56. }, []); */
      57. if (RoutesStore.username === "") {
      58. return <Navigate to={"/login"}>Navigate>;
      59. }
      60. return (
      61. <Layout>
      62. <Layout.Header>
      63. <span>欢迎您【{RoutesStore.username}】span>
      64. <Button onClick={onClick}>注销Button>
      65. Layout.Header>
      66. <Layout>
      67. <Layout.Sider>
      68. <Menu items={RoutesStore.menus} theme="dark" mode="inline">Menu>
      69. Layout.Sider>
      70. <Layout.Content>
      71. <Outlet>Outlet>
      72. Layout.Content>
      73. Layout>
      74. Layout>
      75. );
      76. }
      77. export default observer(A8Main);

    • Navigate 的作用是重定向

    • load 方法的作用是懒加载组件,更重要的是根据字符串找到真正的组件,这是动态路由所需要的

    • children 来进行嵌套路由映射,嵌套路由在跳转后,并不是替换整个页面,而是用新页面替换父页面的 Outlet 部分

  • 相关阅读:
    网络编程之IO模型
    Nginx 负载均衡 初步配置&验证 笔记
    35道最新【软件测试】面试题,常见面试题及答案汇总
    Go语言结构体指针
    Django REST Framework完整教程-认证与权限-JWT的使用
    SQL 优化有哪些技巧?
    架构师的 36 项修炼第06讲:架构核心技术之微服务
    C++ Color the ball
    八个鲜为人知但很实用的Web API
    高校如何基于云原生构建面向未来的智慧校园?全栈云原生VS传统技术架构
  • 原文地址:https://blog.csdn.net/weixin_44478828/article/details/134212307