react v6路由拦截

2023-10-26

本文展示路由的配置以及路由拦截的实现方法。

版本:

"react": "^17.0.2",
"react-router-dom": "6.0.2",

代码:

/App.js

import React from 'react'
import RootRoutes from '@router'
import { BrowserRouter } from 'react-router-dom'

function App () {
  return (
    <BrowserRouter>
      <RootRoutes/>
    </BrowserRouter>
  )
}

export default App

/router/index.jsx

import React from 'react'
import { useRoutes } from 'react-router-dom'
import { resolveRoute } from './utils'
import { routes } from './routes'
const RootRoutes = () => {
  return useRoutes(resolveRoute(routes))
}
function Index () {
  return (
    <RootRoutes />
  )
}
export default Index

/router/routes.jsx(路由表的配置,此处仅仅举个简单的例子)

export const routes = [   
{
	path: '/',
	name: 'home',
	element: <Home />
},
{
  path: '/login',
  element: () => {
    const Login = lazy(() => import('@views/login'))
    return (
      <LoginRedirect>
        <Login />
      </LoginRedirect>
    )
  }
},
{
  path: '/404',
  element: lazy(() => import('@views/error/not-found'))
},
{
  path: '*',
  element: () => <Navigate to='/404' replace />
}
]

utils.js(此文件的 BeforeEach方法 配置了react的路由拦截)

import React, { useEffect } from 'react'
import { useScopeCache } from 'use-scope-cache'
import { Skeleton } from 'antd'
import { useNavigate } from 'react-router-dom'
const cache = useScopeCache({ namespace: 'SAST' })
export function Suspense ({ children, route }) {
  return (
    <React.Suspense
      fallback={
        <div className="view-content">
          <Skeleton active />
        </div>
      }
    >
      <BeforeEach route={route}>
        { children }
      </BeforeEach>
    </React.Suspense>
  )
}

export function resolveRoute (routes) {
  return routes.map(routeItem => {
    const route = { ...routeItem }
    if (route.children) {
      route.children = resolveRoute(route.children)
    }
    if (route.element) {
      route.element = (
        <Suspense route={routeItem}>
          <route.element />
        </Suspense>
      )
    }
    return route
  })
}

// 路由拦截
function BeforeEach ({ children, route }) {
  const navigate = useNavigate()
 /*
 在渲染过程中执行导航操作会导致渲染死循环,
 因此要在组件加载完成(渲染完成)后执行,可以用useEffect来实现
 */
  useEffect(() => {
    if (!cache.get('token')) { // 未登录则跳转登录页面
      // 看是否登录
      navigate('/login')
    }
  }, [])
  return children
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react v6路由拦截 的相关文章

随机推荐

  • CSAPP第二章课后作业题

    include
  • 2020最新字节跳动面试经验分享,已拿到offer (4轮技术面+hr面)

    随着秋招的开启 不管是应届毕业生找工作 还是在职程序员跳槽去找更高薪水的工作 都要面临面试这一难关 应对面试不仅需要丰富的项目经历 还需要牢固的基础知识 在这里 跟大家分享一下我面试字节跳动的经验 包括4轮技术面 hr面 希望对大家有帮助
  • STM32 软件仿真失败 ***** error 65: access violation at 0x40021000 : no ****'read' permission******

    在使用STM32进行软件仿真时 可能会遇到很多问题 最常见的当然如标题所示 STM32 软件仿真失败 no read permission 还有其他很多问题比如 error 35 undefined line number BS Templ
  • react性能优化

    写在前面的话 要想解决问题 首先得找到问题的根源 所以 说起性能分析 还是要从其生命周期和渲染机制说起 1 渲染机制 react的组件渲染分为初始化渲染和更新渲染 在初始化渲染的时候会调用根组件下的所有组件的render方法进行渲染 但是当
  • Eclipse连接Hadoop集群(详细版)

    颜子之不较 孟子之自反 是贤人处横逆之方 子贡之无谄 原思之坐弦 是贤人守贫穷之法 相关连接 HDFS相关知识 Hadoop分布式文件系统 HDFS 快速入门 Hadoop分布式文件系统 HDFS 知识梳理 超详细 Hadoop集群的安装与
  • 人生苦短,我学python

    人生苦短我学python 一个python小白的入门之路 初识Python 刚开始学python是在今年七月 对python的第一印象就是短小而又精悍 变量无需定义即可使用 数不清的大大小小的库信手拈来 笔者以为 python的语法与mat
  • 华为OD机试真题-最长连续子序列-2023年OD统一考试(B卷)

    题目描述 有N个正整数组成的一个序列 给定整数sum 求长度最长的连续子序列 使他们的和等于sum 返回此子序列的长度 如果没有满足要求的序列 返回 1 输入描述 序列 1 2 3 4 2 sum 6 输出描述 序列长度 3 补充说明 输入
  • HJ29 字符串加解密

    描述 1 对输入的字符串进行加解密 并输出 2 加密方法为 当内容是英文字母时则用该英文字母的后一个字母替换 同时字母变换大小写 如字母a时则替换为B 字母Z时则替换为a 当内容是数字时则把该数字加1 如0替换1 1替换2 9替换0 其他字
  • 使用ffmpeg实现给音频,视频添加水印的操作

    本文主要针对ffmpeg进行整理 从而解决在现实中可能存在的问题 1 下载配置ffmpeg 这里参考的是 Java后台用ffmpeg命令给视频添加水印 身后有尾巴 博客园 cnblogs com 1 先去ffmpeg官网下载其压缩包 Dow
  • ElasticSearch详细笔记( 从入门到入土)

    文章目录 1 ElasticSearch概述 1 1 Elasticsearch 是什么 1 2 全文搜索引擎 1 3 Elasticsearch And Solr 2 ElasticSearch安装 2 1 下载和安装 2 2 可能存在的
  • 蓝桥杯——青蛙过河(JAVA)

    题目 小青蛙住在一条河边 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线 小青蛙每次跳跃必须落在一块石头或者岸上 不过 每块石头有一个高度 每次小青蛙从一块石头起跳 这块石头的高度就 会下降 1 当石
  • 关闭IDEA证书信任提示

    原因是你破解了idea idea检测弹出警告 关闭提示的方法
  • Acwing-4510. 寻宝!大冒险!

    本题的突破口在于已知B的左下角为1 A中1的数量是有限的 所以我们可以枚举一下 把B的左下角依次放到A的每一个1的位置上 A最多有1000个1 最多会放1000次 枚举完之后我们再判断一下 如果放到某个A的位置上之后 能否匹配 如何判断A的
  • DNS检测命令dig工具的安装方法

    关于dig命令的使用方法 可见 dns解析设置检测工具dig使用方法及用例里有说明 但是这个命令 不是系统自动的 或是说 一般的系统安装 默认是没有安装到该软件包的 也就是没有该命令了 不过要安装也简单 要用时使用yum安装下即可 dig命
  • get请求中params参数的使用

    一 当发送一个get请求的时候 如果有参数 那么参数应该怎么处理呢 比如 百度阅读里面 查询书的列表 点击进去 它是一个get请求 地址是 https yuedu baidu com book list 0 fr indextop 怎么可以
  • 常用访问路径

    http www json cn
  • (六)springcloud之Nacos集群与持久化配置-3

    模块 1 父工程 管理版本 2 公共模块 Common API 3 测试模块 NacosClusterConfigConsumer80 版本 springboot 2 7 6 springcloud 2021 0 5 spring clou
  • 跑跑yolov5吧

    跑跑yolov5 如果只是要快速上手训练得到训练结果 我的建议是直接使用b导的代码 别问为什么 问就是我是b导小迷弟 但是 b导的代码好像是自己写的 会存在 下载的权重文件是pth 最后得到的文件是pth文件 的问题 因为我想要用来跑自动标
  • c语言数字中英文转换器,C现代实现方法 数字转换为英文单词

    include int main int d 0 a 0 b 0 printf Enter a two digit number scanf d d if d 10 0 d 100 0 perror d exit 1 a d 10 b d
  • react v6路由拦截

    本文展示路由的配置以及路由拦截的实现方法 版本 react 17 0 2 react router dom 6 0 2 代码 App js import React from react import RootRoutes from rou