React封装高阶组件实现路由权限的控制详解

 更新时间:2025年02月03日 10:42:37   作者:shenyaofeng  
这篇文章主要介绍了React封装高阶组件实现路由权限的控制,在React中,为了实现安全可靠的路由权限控制,可以通过多种方式来确保只有经过授权的用户才能访问特定路径下的资源,下面来介绍封装高阶组件控制的方法,需要的朋友可以参考下

React高阶组件是什么

官方解释∶

高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。

高阶组件(HOC)就是一个函数,且该函数接受一个组件作为参数,并返回一个新的组件,它只是一种组件的设计模式,这种设计模式是由react自身的组合性质必然产生的。我们将它们称为纯组件,因为它们可以接受任何动态提供的子组件,但它们不会修改或复制其输入组件中的任何行为。

HOC的优缺点

  • 优点∶ 逻辑复用、不影响被包裹组件的内部逻辑。
  • 缺点∶hoc传递给被包裹组件的props容易和被包裹后的组件重名,进而被覆盖

路由权限控制做什么

主要就是判断用户是否登陆,只有登陆获取到有效的token,才能跳转到页面。

思路:

判断是否有 token ,如果有 token 则返回正常的组件,如果没有 token 则跳转到登陆页。

实现:

因为是ts所以先定义参数类型,这里的ReactElement代表的是一个 React 元素例如:<div/> 或者是组件。之后我们获取到 token ,通过 token 的有无判断跳转到相应页面。

代码

封装高阶组件:

interface AuthRouteProps {
  children: React.ReactElement;
}
export function AuthRoute({ children }: AuthRouteProps) {
  const token = getToken();
  if (token) {
    return <>{children}</>;
  } else {
    // 使用 Navigate 组件进行导航
    message.error("请先登录");
    return <Navigate to="/login" />;
  }
}

在路由配置文件中,引入封装的组件,例如:

children: [
      {
        index: true,
        element: <Chat />
      },
      {
        path: '/paint',
        element: (
          <AuthRoute><Paint /></AuthRoute>
        )
      },
      {
        path: '/me',
        element: <div>我的</div>
      }
    ]

缺点

目前只是通过判断 token 有无,如果 token 失效了却还是会跳转,如果是跳转到的页面需要携带token 则可以在响应拦截器中进行处理:token 会发给后端,后端通过解密后来判断用户是否存在

// 添加响应拦截器
request.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data;
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    if(error.status === 401){
      removeToken()
      router.navigate('/login')
      window.location.reload()
    }
    return Promise.reject(error);
  }
);

如果只是单纯的跳转页面的话要进行改造也是发一个请求给后端,后端通过处理返回给前端 token 是否有效:

export async function AuthRoute({children}){
  const token = getToken();
  // 模拟请求发给后端token
  const res = await getUserInfo({ token });
  if (res.data.code) {
    return <>{children}</>;
  } else {
    return <Navigate to="/login" replace />;
  }
}

所以要通过具体的业务来处理用户登陆和 token 是否有效。

比较

通过这样的方式写和直接在访问页面中判断token有什么区别?

直接在访问页面时判断:这种方式通常是在页面组件加载或渲染时进行的,即在用户已经导航到该页面后才进行检查。

使用AuthRoute组件:判断是在路由跳转之前进行的。当用户尝试访问受保护的路由时,AuthRoute组件会首先检查token,然后决定是否允许访问或进行重定向。

以上就是React封装高阶组件实现路由权限的控制详解的详细内容,更多关于React路由权限控制的资料请关注脚本之家其它相关文章!

相关文章

  • React 跨端动态化核心技术实例分析

    React 跨端动态化核心技术实例分析

    这篇文章主要为大家介绍了React 跨端动态化核心技术实例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 浅谈React 服务器端渲染的使用

    浅谈React 服务器端渲染的使用

    本篇文章主要介绍了浅谈React 服务器端渲染的使用,React是最受欢迎的客户端 JavaScript 框架,在本教程中,我们将逐步向您介绍服务器端的渲染示例
    2018-05-05
  • 详解React获取DOM和获取组件实例的方式

    详解React获取DOM和获取组件实例的方式

    这篇文章主要介绍了React获取DOM和获取组件实例的方式,如何创建refs来获取对应的DOM呢?目前有三种方式,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • React事件处理超详细介绍

    React事件处理超详细介绍

    这篇文章主要介绍了React事件处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • 详解React服务端渲染从入门到精通

    详解React服务端渲染从入门到精通

    这篇文章主要介绍了详解React服务端渲染从入门到精通,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • React项目动态修改主题颜色的方案

    React项目动态修改主题颜色的方案

    这篇文章主要介绍了React项目动态修改主题颜色的方案,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2025-01-01
  • React Hooks中 useRef和useImperativeHandle的使用方式

    React Hooks中 useRef和useImperativeHandle的使用方式

    这篇文章主要介绍了React Hooks中 useRef和useImperativeHandle的使用方式,文中说明了useRef和useCallback一起使用, 可以解决闭包陷阱的问题,本文结合实例代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • React Native 中处理 Android 手机吞字的解决方案

    React Native 中处理 Android 手机吞字的解决方案

    这篇文章主要介绍了React Native 中处理 Android 手机吞字的解决方案,作者在 React Native 0.67.4 环境下,编写了一个小 demo 来复现这个问题,需要的朋友可以参考下
    2022-08-08
  • React封装CustomSelect组件思路详解

    React封装CustomSelect组件思路详解

    小编需要封装一个通过Popover弹出框里可以自定义渲染内容的组件,渲染内容暂时有: 单选框, 复选框,接下来通过本文给大家分享React封装CustomSelect组件思路,需要的朋友可以参考下
    2022-07-07
  • 浅谈react路由传参的几种方式

    浅谈react路由传参的几种方式

    这篇文章主要介绍了浅谈react路由传参的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论