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" />;
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/609883.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年5月6日优雅草蜻蜓API大数据服务中心v2.0.3更新

v2.0.3更新 2024年5月6日优雅草蜻蜓API大数据服务中心v2.0.3更新-修复改版后搜索框漏掉的bug-增加搜索框 提示&#xff1a;优雅草大数据中心已经 上线137天 稳定运行 1181555 次 累积调用 目前大数据中心用户呈现增长趋势&#xff0c;目标2024年11月底突破1亿次调用&#xf…

大语言模型的后处理

后处理的输入 常规意义上的大模型处理流程 import torch from transformers import LlamaForCausalLM, LlamaTokenizer# 加载模型和tokenizer model LlamaForCausalLM.from_pretrained("decapoda-research/llama-7b-hf") tokenizer LlamaTokenizer.from_pretrain…

这个 TypeScript 技巧会让你大吃一惊

从字符串数组中提取自定义类型 “在 TypeScript 的世界里&#xff0c;自定义类型从字符串数组中显现&#xff0c;就像隐藏的宝石。” TypeScript 是一个操纵现有数据和发展良好实践的神奇工具。 今天&#xff0c;我们将探索如何以正确的方式从字符串数组中提取全名&#xff0c…

MPAndroidChart 详细使用 - BarChart

chart下面的方法 getDescription().setEnabled(boolean enabled);//设置描述是否显示 setPinchZoom(boolean enabled);//设置x轴和y轴能否同时缩放。默认是否 setScaleEnabled(boolean enabled);//是否支持缩放 setScaleXEnabled(boolean enabled);//启用/禁用x轴上的缩放 setS…

Vue2中子组件调用父组件的方法,父组件调用子组件的方法,父子组件互相传值和方法调用

&#x1f49f; 上一篇文章 组件之间的多种通信方式&#xff0c;一文彻底搞懂组件通信&#xff01;​​​​​​​ &#x1f4dd; 系列专栏 vue从基础到起飞 目录 一、父组件调用子组件的方法 二、子组件调用父组件的方法 1、使用this.$emit()向父组件触发一个事件,父组件监听…

HTTPS 原理和 TLS 握手机制

HTTPS的概述与重要性 在当今数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;数据在传输过程中的安全性备受关注。HTTPS 作为一种重要的网络通信协议&#xff0c;为数据的传输提供了强有力的安全保障。它是在 HTTP 的基础上发展而来&#xff0c;通过引入数据加密机制&a…

RazorSQL for Mac:强大而全面的数据库管理工具

RazorSQL for Mac是一款功能强大、操作简便的数据库管理工具。它专为Mac用户设计&#xff0c;支持连接超过30种不同类型的数据库&#xff0c;包括MySQL、Oracle、PostgreSQL等&#xff0c;为用户提供了全面的数据库管理解决方案。 RazorSQL具有强大的数据库浏览功能&#xff0c…

【吃透Java手写】3-SpringBoot-简易版-源码解析

【吃透Java手写】SpringBoot-简易版-源码解析 1 SpringbootDemo2 准备工作2.1 Springboot-my2.1.1 依赖2.1.2 SpringBootApplication2.1.3 SJBSpringApplication2.1.3.1 run方法 2.2 Springboot-user2.2.1 依赖2.2.2 UserController2.2.3 UserApplication 2.3 分析run方法的逻辑…

图神经网络(GNNs)在时间序列分析中的应用

时间序列数据是记录动态系统测量的主要数据类型&#xff0c;由物理传感器和在线过程&#xff08;虚拟传感器&#xff09;大量生成。时间序列分析对于解锁可用数据中隐含的丰富信息至关重要。随着图神经网络&#xff08;GNNs&#xff09;的最近进展&#xff0c;基于GNN的方法在时…

5月10日学习记录

[NCTF2019]True XML cookbook(xxe漏洞利用) 这题是关于xxe漏洞的实际应用&#xff0c;利用xxe漏洞的外部实体来进行ssrf探针内网的主机 和[NCTF2019]Fake XML cookbook的区别就在于xxe漏洞的利用方向&#xff0c;一个是命令执行&#xff0c;一个是SSRF 看题&#xff0c;打开…

JavaScript原理篇——Promise原理及笔试题实战演练

Promise 是 JavaScript 中用于处理异步操作的对象&#xff0c;它代表了一个可能还没有完成的操作的最终完成或失败&#xff0c;以及其结果值。Promise 对象有三种状态&#xff1a; Pending&#xff08;进行中&#xff09;&#xff1a;初始状态&#xff0c;既不是成功&#xff0…

语言基础 /CC++ 可变参函数设计与实践,va_ 系列实战详解(强制参数和变参数的参数类型陷阱)

文章目录 概述va_ 系列定义va_list 类型va_start 宏从变参函数的强制参数谈起宏 va_start 对 char 和 short 类型编译告警宏 va_start 源码分析猜测 __va_start 函数实现 va_arg 宏宏 va_arg 无法接受 char 和 short为啥va_arg可解析int却不能解析float类型&#xff1f;宏 va_a…

Mybatis之ResultMap

前言 select语句查询得到的结果集是一张二维表&#xff0c;水平方向上看是一个个字段&#xff0c;垂直方向上看是一条条记录。而Java是面向对象的程序设计语言&#xff0c;对象是根据类定义创建的&#xff0c;类之间的引用关 系可以认为是嵌套的结构。在JDBC编程中&#xff0c…

PyTorch中定义自己的数据集

文章目录 1. 简介2. 查看PyTorch自带的数据集(可视化)3. 准备材料3.1 图片数据3.2 标签数据 4. 方法 1. 简介 尽管PyTorch提供了许多自带的数据集&#xff0c;如MNIST、CIFAR-10、ImageNet等&#xff0c;但它们对于没有经验的用户来说&#xff0c;理解数据加载器的工作原理以及…

【数据结构】栈的实现以及数组和链表的优缺点

个人主页&#xff1a;一代… 个人专栏&#xff1a;数据结构 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进…

批量自定义重命名,一键添加顺序编号,文件夹管理更高效!

我们经常需要对文件夹进行管理和整理。然而&#xff0c;当面对大量需要改名的文件夹时&#xff0c;手动逐个修改不仅效率低下&#xff0c;还容易出错。那么&#xff0c;有没有一种方法能够批量自定义重命名文件夹&#xff0c;并在名称后自动添加顺序编号呢&#xff1f;答案是肯…

C++反汇编——多态,面试题01

文章目录 1.C的三大特性1.1封装1.2继承1.3多态1.3.1 虚函数1.3.2 多态代码反汇编分析。反汇编分析1——基类指针指向子类对象&#xff0c;构造过程。反汇编分析2——基类指针指向子类对象&#xff0c;调用虚函数getPrice()过程。反汇编分析3——基类对象&#xff0c;调用虚函数…

版本控制工具之Git的基础使用教程

Git Git是一个分布式版本控制系统&#xff0c;由Linux之父Linus Torvalds 开发。它既可以用来管理和追踪计算机文件的变化&#xff0c;也是开发者协作编写代码的工具。 本文将介绍 Git 的基础原理、用法、操作等内容。 一、基础概念 1.1 版本控制系统 版本控制系统&#x…

PSoc™62开发板之IoT应用

实验目的 使用PSoc62™开发板驱动OLED模块&#xff0c;实时监控室内的光照强度、温度信息 实验准备 PSoc62™开发板SSD1309 OLED模块DS18B20温度传感器BH1750光照传感器 模块电路 SSD1309 OLED模块的电路连接和模块配置教程请参考之前的文章&#xff0c;这里不详细展开描…

汽车EDI:IAC Elmdon EDI 对接指南

近期收到客户C公司的需求&#xff0c;需要与其合作伙伴IAC Elmdon建立EDI连接&#xff0c;本文将主要为大家介绍IAC Elmdon EDI 对接指南&#xff0c;了解EDI项目的对接流程。 项目需求 传输协议&#xff1a;OFTP2 IAC Elmdon 与其供应商之间使用的传输协议为OFTP2。OFTP2是…
最新文章