react router v6总结

一、使用createBrowserRouter()创建路由:

1、src/router/index.js:

复制代码
import { createBrowserRouter } from "react-router-dom";
import ErrorPage from "@/pages/404/";

const router = createBrowserRouter([
  {
    path: "/",
    errorElement: <ErrorPage />,
    async lazy() {
      const { default: App } = await import("../App.js");
      return { Component: App };
    },
    children: [
      {
        errorElement: <ErrorPage />,
        children: [
          {
            index: true,
            async lazy() {
              const { default: Home } = await import("../pages/home/");
              return { Component: Home };
            },
          },
          {
            path: "collapse",
            async lazy() {
              const { default: Collapse } = await import("../pages/collapse/");
              return { Component: Collapse };
            },
          },
          {
            path: "timeline",
            async lazy() {
              const { default: Timeline } = await import("../pages/timeline/");
              return { Component: Timeline };
            },
          },
        ],
      },
    ],
  },
  {
    path: "/admin",
    async lazy() {
      const { default: Admin } = await import("../pages/admin/");
      return { Component: Admin };
    },
  },
]);

export default router;

注意其中的index: true

复制代码
{
            index: true,
            async lazy() {
              const { default: Home } = await import("../pages/home/");
              return { Component: Home };
            },
          }

2、src/index.js:

复制代码
import React from "react";
import ReactDOM from "react-dom/client";
import "@/index.css";
import { RouterProvider } from "react-router-dom";
import router from "@/router";
import reportWebVitals from "@/reportWebVitals";

const root = ReactDOM.createRoot(document.getElementById("root"));

root.render(
  // <React.StrictMode>
  //   <App />
  //   {/* <Admin/> */}
  // </React.StrictMode>
  <RouterProvider router={router} />
);

// 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();

注意其中的:

复制代码
<RouterProvider router={router} />

3、src/App.js:

复制代码
import React from "react";
import { Layout } from "antd";
import Dropdown from "@/components/header/Dropdown";
import "@/App.css";
import SiderMenu from "@/components/sider-menu/";
import { observer } from "mobx-react";
import mobxData from "@/store/MobxData";
import { Outlet } from "react-router-dom";

const { Header, Content, Sider } = Layout;

const App = () => {
  return (
    <Layout className="app-wrapper">
      <Header className="app-header">
        <div className="app-logo">
          <img height="36" src={require("./logo.png")} />
        </div>
        <Dropdown />
      </Header>
      <Layout className="app-wrapper-in">
        <Sider width={mobxData.width} className="app-sider">
          <SiderMenu />
        </Sider>
        <Layout
          style={{
            padding: "0 24px 0",
            background: "#e9e9ed",
          }}
        >
          <Content className="app-content">
            <Outlet />
          </Content>
        </Layout>
      </Layout>
    </Layout>
  );
};

export default observer(App);

注意其中的:

复制代码
<Outlet />

4、src/sider-menu/index.js:

复制代码
import React, { useState } from "react";
import {
  HomeOutlined,
  FolderOutlined,
  AppstoreOutlined,
  ReadOutlined,
  TableOutlined,
  ProductOutlined,
  MenuFoldOutlined,
  MenuUnfoldOutlined,
} from "@ant-design/icons";
import "./index.css";
import mobxData from "@/store/MobxData";
import { NavLink } from "react-router-dom";

const App = () => {
  const [status, setStatus] = useState(false);
  const onclick = () => {
    setStatus(!status);

    if (status) {
      mobxData.changeWidth(30);
    } else {
      mobxData.changeWidth(-30);
    }

    const elements = document.querySelectorAll(".menu-item dd");
    for (let i = 0; i < elements.length; i++) {
      if (status) {
        elements[i].style.display = "block";
      } else {
        elements[i].style.display = "none";
      }
    }
  };

  return (
    <div className="menu">
      <NavLink to="/">
        <dl className="menu-item">
          <dt>
            <HomeOutlined />
          </dt>
          <dd>我的门户</dd>
        </dl>
      </NavLink>
      <NavLink to="/timeline">
        <dl className="menu-item">
          <dt>
            <FolderOutlined />
          </dt>
          <dd>文档中心</dd>
        </dl>
      </NavLink>
      <NavLink to="/collapse">
        <dl className="menu-item">
          <dt>
            <AppstoreOutlined />
          </dt>
          <dd>工作中心</dd>
        </dl>
      </NavLink>
      <dl className="menu-item">
        <dt>
          <ReadOutlined />
        </dt>
        <dd>知识中心</dd>
      </dl>
      <dl className="menu-item">
        <dt>
          <TableOutlined />
        </dt>
        <dd>表格中心</dd>
      </dl>
      <dl className="menu-item">
        <dt>
          <ProductOutlined />
        </dt>
        <dd>应用</dd>
      </dl>

      <div className="collapse">
        {status ? (
          <MenuUnfoldOutlined onClick={onclick} />
        ) : (
          <MenuFoldOutlined onClick={onclick} />
        )}
      </div>
    </div>
  );
};

export default App;

注意其中的NavLink及css中添加的active属性

5、路由鉴权:src/components/auth/index.js

复制代码
import React, { useEffect } from "react";
// import { useNavigate } from "react-router-dom";
import { Navigate } from "react-router-dom";

export default function Auth({ children }) {
  //判断token是否存在
  localStorage.setItem("token", "1");
  const isAuth = localStorage.getItem("token");

  console.log("isAuth");
  console.log(isAuth);

  if (isAuth && Number(isAuth) !== 1) {
    return <>{children}</>;
  } else {
    console.log("没有token请重新登录");
    console.log(<Navigate to="/admin" />);
    return <Navigate to="/admin" />;
  }
}
相关推荐
开开心心就好27 分钟前
电脑息屏工具,一键黑屏超方便
开发语言·javascript·电脑·scala·erlang·perl
web守墓人1 小时前
【前端】ikun-markdown: 纯js实现markdown到富文本html的转换库
前端·javascript·html
中微子6 小时前
🔥 React Context 面试必考!从源码到实战的完整攻略 | 99%的人都不知道的性能陷阱
前端·react.js
秋田君7 小时前
深入理解JavaScript设计模式之命令模式
javascript·设计模式·命令模式
中微子7 小时前
React 状态管理 源码深度解析
前端·react.js
风吹落叶花飘荡8 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript
yanlele9 小时前
我用爬虫抓取了 25 年 6 月掘金热门面试文章
前端·javascript·面试
lichenyang4539 小时前
React移动端开发项目优化
前端·react.js·前端框架
天若有情6739 小时前
React、Vue、Angular的性能优化与源码解析概述
vue.js·react.js·angular.js
烛阴9 小时前
WebSocket实时通信入门到实践
前端·javascript