React-router6实现全局路由守卫

在React里面,它不像Vue一样,为我们提供和很多方便的功能,一些功能都需要自己去进行封装比如说路由拦截,也需要自己进行封装。

1.创建路由

import { useRoutes, useLocation, Outlet } from "react-router-dom";
import { Navigate } from "react-router";
import {  Suspense, useState, useEffect } from "react";
 import Home from '../pages/home'
 import HomeOne from '../pages/homeone'
 import HomeTwo from '../pages/hometwo'
const Myrouters = [
  {
    path:'/',
    element:<Navigate to='/home'></Navigate>
  },
  {
    path:'/home',
    element:<Home></Home>
  },
  {
    path:'/homeone',
    element:<HomeOne></HomeOne>
  },
  {
    path:'/hometwo',
    element:<HomeTwo></HomeTwo>
  },
];

const Router = () => (
  <Suspense fallback={<div>loading</div>}>{useRoutes(Myrouters)}</Suspense>
);
export { Router };

可以看到我创建了三个路由,home,hometwo,homethree,接下来可以在app.jsx进行引入,然后将其已组件的形式使用。

如:<Router></Router>

2.全局守卫

在上面代码修改如下,向外多暴露了一个RouterBeforeEach,也需要在app.jsx引入。

const RouterBeforeEach = () => {
  const location = useLocation();
  const navigator =useNavigate()
  useEffect(() => {
    if(location.pathname=='/home'){
      navigator('/hometwo')
    }
  });
  return <Outlet />
};
export { Router, RouterBeforeEach };

RouterBeforeEach是一个用来监听路由变化的组件每一次路由变化都会触发useEffect函数,通过Outlet返回一个路由出口,不影响其它路由zujian,这个时候我们可以通过useLocation来获取路由的信息比如对home进行一个限制不让你进入。通过location.pathname获取跳转路由的名称,让其如果进入home跳转hometwo,代码如下

const RouterBeforeEach = () => {
  const location = useLocation();
  const navigator =useNavigate()
  useEffect(() => {
    if(location.pathname=='/home'){
      navigator('/hometwo')
    }
  });
  return <Outlet />
};

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值