React Router 路由守卫

2023-11-18

React Router 路由守卫

组件内路由守卫

1、下面是使用高阶组件实现路由守卫的示例代码:

import React from 'react';
import { Route, Redirect } from 'react-router-dom';

const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => (
  <Route
    {...rest}
    render={(props) =>
      isAuthenticated ? (
        <Component {...props} />
      ) : (
        <Redirect to={{ pathname: '/login', state: { from: props.location } }} />
      )
    }
  />
);

export default PrivateRoute;

在上面的代码中,PrivateRoute 是一个高阶组件,它接收一个组件作为参数,并返回一个新的组件。在 render 方法中,如果用户已经登录,则渲染传入的组件;否则,重定向到登录页面。通过使用该高阶组件,我们可以在需要进行权限验证的路由上使用 PrivateRoute 来保护路由,例如:

<Switch>
  <PrivateRoute exact path="/" component={Home} isAuthenticated={isAuthenticated} />
  <PrivateRoute path="/dashboard" component={Dashboard} isAuthenticated={isAuthenticated} />
  <Route path="/login" component={Login} />
</Switch>

其中 isAuthenticated 是一个布尔值,表示当前用户是否已经登录。

2、使用 函数组件或 render 属性来实现路由守卫

React Router 可以使用 Route 组件的 render 属性或函数式组件来实现路由守卫。

使用 render 属性时,可以传入一个函数,根据需要来渲染不同的组件或页面。在这个函数中可以实现路由守卫的逻辑,例如检查用户是否登录,根据用户角色判断是否有权限访问该页面等。如果不满足条件,可以返回一个重定向或提示信息,否则可以渲染目标组件或页面。

示例代码:

import { Route, Redirect } from 'react-router-dom';

function PrivateRoute({ component: Component, isAuth, ...rest }) {
  return (
    <Route
      {...rest}
      render={(props) =>
        isAuth ? (
          <Component {...props} />
        ) : (
          <Redirect
            to={{
              pathname: '/login',
              state: { from: props.location },
            }}
          />
        )
      }
    />
  );
}

在上面的示例中,PrivateRoute 组件接受三个参数:component,代表需要渲染的目标组件;isAuth,代表用户是否已登录;rest,代表其他参数,例如路由路径等。在 render 函数中,如果用户已登录,就渲染目标组件,否则返回一个重定向到登录页面。

使用函数式组件时,可以将需要实现路由守卫的逻辑直接写在函数组件中,例如在 useEffect 钩子函数中进行判断。如果不满足条件,可以使用 history.push 方法进行重定向。

import { useEffect } from 'react';
import { useHistory } from 'react-router-dom';

function PrivatePage() {
  const history = useHistory();
  const isAuth = true;

  useEffect(() => {
    if (!isAuth) {
      history.push('/login');
    }
  }, [isAuth, history]);

  return <div>Private Page</div>;
}

在上面的示例中,如果用户未登录,就会使用 history.push 方法将页面重定向到登录页面。这里的 useEffect 钩子函数会在组件渲染完成后执行,也可以根据需要添加其他依赖项。

全局路由守卫

虽然React没有路由守卫,但是我们可以通过高阶组件实现相关功能,使用方法如下

  1. 创建 AuthRoute.tsx 文件(位置可根据自己的习惯存放)
import React from 'react';
import { Navigate, useLocation } from 'react-router-dom';
const allowList = ['/login', '/register'];
const loginRoute = '/login';
const indexRoute = '/'
export default function AuthRoute(props) {
  const location = useLocation();
  // children 为子组件
  const { children } = props;
  // 根据 token 对路由进行权限校验,需要和后端配合使用
  // 这里的 token 一般是登陆成功之后拿到后端返回的 token 并通过 Cookie.set('token', token字符串, {
  //    expires: time_limit // 设置存放时间
  // })设置
  let token = false;
  if (token && token !== 'undefined') {
    // 有 token 的状态下禁止用户回到登录页,重定向到首页
    if (location.pathname === loginRoute) {
      return <Navigate to={indexRoute}></Navigate>;
    } else {
      // 其他路由均可正常跳转
      return <>{children}</>;
    }
  } else {
    // 无 token 的状态下,如果要跳转的路由是白名单中的路由,正常跳转
    if (allowList.includes(location.pathname || '')) {
      return <>{children}</>;
    } else {
      // 无 token 且非白名单路由,重定向至登录页
      return <Navigate to={loginRoute}></Navigate>;
    }
  }
}

//https://zhuanlan.zhihu.com/p/628935247 React Router 组件路由守卫(Route Guard)的机制
  1. 在 App.tsx中引入并设置
import React from 'react';
import ReactDOM from 'react-dom/client';
import './styles/basic.scss';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';
import ThemeContext from './store/themeContext';
import store from './store';
import AuthRoute from './auth/auth';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <BrowserRouter>
      <ThemeContext.Provider
        value={{
          store
        }}
      >
        <AuthRoute>
          <App />
        </AuthRoute>
      </ThemeContext.Provider>
    </BrowserRouter>
  </React.StrictMode>
);

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

React Router 路由守卫 的相关文章

随机推荐

  • jwt 私钥_基于JWT的token弱密钥爆破

    JSON Web Token JWT 是目前最流行的跨域身份验证解决方案 直接根据token取出保存的用户信息 以及对token可用性校验 大大简化单点登录 JWT header payload signature 以 相隔 例 eyJhb
  • SpringBoot3基础:最简项目示例

    说明 本文建立一个最基本的SpringBoot3项目 依赖项仅包含 spring web SpringMVC 备注 SpringBoot3需要JDK17支持 配置方法参考 SpringBoot3项目中配置JDK17 项目结构图示 POM
  • 现在学UI设计有前途吗?UI设计收入大概多少

    随着互联网的高速发展以及大量的人奔涌进入UI设计行业 我们发现想要通过UI实现高薪就业变得不再容易 这让很多人担忧 现在学UI设计还有前途吗 千锋郑州UI设计老师从市场需求 就业薪资以及职业发展方向三个角度分析后可以负责的告诉你有前途 UI
  • docke的基础入门

    docker基础入门操作 一 如何安装docker 一 如何安装docker 安装docker命令通过一下命令顺序执行 即可进行安装 校验操作系统内核版本 要求是3 10以上的版本 1 安装一些必要的系统工具 其中yum utils包含yu
  • 由于找不到vcomp140.dll无法继续执行此代码?该怎么修复呢?

    在使用计算机过程中 我们有时会遇到缺少vcomp140 dll文件的问题 这可能导致某些应用程序无法正常运行 遇到了缺少vcomp140 dll文件的问题 这给我的正常工作和娱乐带来了一些困扰 经过一番努力 我成功修复了这个问题 并对此总结
  • shell中括号的特殊用法 linux if多条件判断

    shell中括号的特殊用法 linux if多条件判断 一 bash 单双括号 基本要素 两个符号左右都要有空格分隔 内部操作符与操作变量之间要有空格 如 a b 字符串比较中 gt lt 需要写成 gt lt 进行转义 中字符串或者 变量
  • Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierImpl.getM的原因及解决办法

    一 原因 从别人那里拿来的gradle项目 然后自己用idea跑的时候报错 Cause org jetbrains plugins gradle tooling util ModuleComponentIdentifierImpl getM
  • linux 解锁用户被锁

    一般我们在开发时部署好了环境 有时候用xshell 登录服务器时我们经常会忘记用户的登录密码 我们经常会遇到用户被锁定 首先 用root 用户查看 查看被锁用户的错误登录次数 pam tally2 u tom tom 为用户 pam tal
  • qt集成cef QWidget

    编译libcef dll wrapper 假设你已经编译出了libcef dll wrapper lib Debug和Release版本 并且对应版本的程序集类型分别是 MDd和MD qt的运行时库是MDd类型的 因此cef3编译的时候也应
  • hive 异常之 MetaException

    直接启动hive后 hive gt show databases FAILED SemanticException org apache hadoop hive ql metadata HiveException java lang Run
  • vue3中对本地存储的数据多次修改并实时页面显示

    背景 项目中遇到切换用户时 对App页面的信息进行实时显示 登录时存储一次 切换时再次存储 解决办法 1 在每次存储的同时存储到pinia中 可解决实时显示问题 import useCommonStore from pinia ls set
  • 软件测试中的43个功能测试点总结

    功能测试就是对产品的各功能进行验证 根据功能测试用例 逐项测试 检查产品是否达到用户要求的功能 针对web系统的常用测试方法如下 1 页面链接检查 每一个链接是否都有对应的页面 并且页面之间切换正确 可以使用一些工具 如LinkBotPro
  • C++学习(四八七)android studio println的输出位置

    程序中调用如下输出 System out println haha1 调试情况下 在Run和LogCat下均看不到输出 运行情况下 在Run下能看到输出 建议如下 可在LogCat中看到信息 android util Log常用的方法有以下
  • 蓝牙之十三-HFPclient JNI层

    JNI到app JAVA
  • 开营

    2021未来杯区块链应用创新大赛已于9月24日正式启动 本届大赛是由中国信息协会主办 中国信息协会教育分会 艾肯文化传媒 北京 有限公司 中软国际教育科技集团 以太坊行星承办 北京大学研发实验服务基地 iCAN国际联盟 STEERTECH科
  • echarts修改折线图样式,总结踩坑以及常用

    以折线图为例 最终呈现的效果是这样的 在最外层可以设置 距离外层box的距离 myChart setOption grid 距离外层box左右位置 x 30 左 y 45 上 x2 45 右 y2 40 下 borderWidth 1 在x
  • 【WSN无线传感器网络恶意节点】使用 MATLAB 进行无线传感器网络部署研究

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 在无线传感器网络部署方面 您计划在一个 1
  • React重新渲染的触发机制及其优化策略

    React是一个用于构建用户界面的JavaScript库 它的核心特点之一是使用虚拟DOM Virtual DOM 来实现高效的组件渲染 那组件重新渲染的机制是如何呢 基于这些机制 如果进行优化呢 虚拟DOM是一个用JavaScript对象
  • 逆向破解学习-登山赛车

    试玩 课程中的内容 Hook代码 import de robv android xposed XC MethodHook import de robv android xposed XposedHelpers import de robv
  • React Router 路由守卫

    React Router 路由守卫 组件内路由守卫 1 下面是使用高阶组件实现路由守卫的示例代码 import React from react import Route Redirect from react router dom con