react_13

React Router

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

npm install react-router-dom

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

  • 使用

    新建文件 src/router/MyRouter.tsx

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

    index.tsx 修改为

  • import ReactDOM from "react-dom/client";
    import "./index.css";
    
    import reportWebVitals from "./reportWebVitals";
    
    import { ConfigProvider } from "antd";
    import zhCN from "antd/es/locale/zh_CN";
    
    import MyRouter from "./router/MyRouter";
    import { BrowserRouter } from "react-router-dom";
    const root = ReactDOM.createRoot(
      document.getElementById("root") as HTMLElement
    );
    
    root.render(
      <ConfigProvider locale={zhCN}>
        <BrowserRouter>
          <MyRouter></MyRouter>
        </BrowserRouter>
      </ConfigProvider>
    );
    
    // If you want to start measuring performance in your app, pass a function
    // to log results (for example: reportWebVitals(console.log))
    // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
    reportWebVitals();
    

    A8Main 的代码

  • import {
      DownCircleOutlined,
      MenuFoldOutlined,
      VerticalAlignTopOutlined,
    } from "@ant-design/icons";
    import { Button, Layout, Menu } from "antd";
    import { ItemType } from "antd/es/menu/hooks/useItems";
    import { Link, Navigate, Outlet, useNavigate } from "react-router-dom";
    import Icon from "../store/Icon";
    import StudentStore from "../store/StudentStore";
    import RoutesStore from "../store/RoutesStore";
    import { observer } from "mobx-react-lite";
    import { useEffect } from "react";
    
    function A8Main() {
      const items: ItemType[] = [
        {
          label: <Link to="/student">学生管理</Link>,
          key: 1,
          icon: <DownCircleOutlined />,
        },
        {
          label: <Link to="/teacher">教师管理</Link>,
          key: 2,
          icon: <VerticalAlignTopOutlined />,
        },
        {
          label: "用户管理",
          key: 3,
          icon: <MenuFoldOutlined />,
          children: [
            {
              label: "功能一",
              key: 31,
              icon: <Icon name="PicLeftOutlined"></Icon>,
            },
            {
              label: "功能二",
              key: 32,
              icon: <Icon name="BorderHorizontalOutlined"></Icon>,
            },
          ],
        },
      ];
      const nav = useNavigate();
      //点击注销按钮,清空localStorage里面和state数据,跳转到登录页面
      function onClick() {
        RoutesStore.reset();
        nav("/login");
      }
      //useEffect()的执行时机是先生成了jsx代表,然后执行了副作用,然后再渲染,正在渲染的时候执行了跳转,所以看到
      //主页一闪而过,
      /* useEffect(() => {
        if (RoutesStore.username === "") {
          nav("/login");
        }
      }, []); */
      if (RoutesStore.username === "") {
        return <Navigate to={"/login"}></Navigate>;
      }
      return (
        <Layout>
          <Layout.Header>
            <span>欢迎您【{RoutesStore.username}】</span>
            <Button onClick={onClick}>注销</Button>
          </Layout.Header>
          <Layout>
            <Layout.Sider>
              <Menu items={RoutesStore.menus} theme="dark" mode="inline"></Menu>
            </Layout.Sider>
            <Layout.Content>
              <Outlet></Outlet>
            </Layout.Content>
          </Layout>
        </Layout>
      );
    }
    export default observer(A8Main);
    

  • Navigate 的作用是重定向

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的翠花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值