React封装高阶组件实现路由权限的控制详解
目录
React高阶组件是什么
官方解释∶
高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。
高阶组件(HOC)就是一个函数,且该函数接受一个组件作为参数,并返回一个新的组件,它只是一种组件的设计模式,这种设计模式是由react自身的组合性质必然产生的。我们将它们称为纯组件,因为它们可以接受任何动态提供的子组件,但它们不会修改或复制其输入组件中的任何行为。
HOC的优缺点
- 优点∶ 逻辑复用、不影响被包裹组件的内部逻辑。
- 缺点∶hoc传递给被包裹组件的props容易和被包裹后的组件重名,进而被覆盖
路由权限控制做什么
主要就是判断用户是否登陆,只有登陆获取到有效的token,才能跳转到页面。
思路:
判断是否有 token ,如果有 token 则返回正常的组件,如果没有 token 则跳转到登陆页。
实现:
因为是ts所以先定义参数类型,这里的ReactElement
代表的是一个 React 元素例如:
代码
封装高阶组件:
interface AuthRouteProps { children: React.ReactElement; } export function AuthRoute({ children }: AuthRouteProps) { const token = getToken(); if (token) { return <>{children}>; } else { // 使用 Navigate 组件进行导航 message.error("请先登录"); return; } }
在路由配置文件中,引入封装的组件,例如:
children: [ { index: true, element:}, { path: '/paint', element: ( ) }, { path: '/me', element: 我的} ]
缺点
目前只是通过判断 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; } }
所以要通过具体的业务来处理用户登陆和 token 是否有效。
比较
通过这样的方式写和直接在访问页面中判断token有什么区别?
直接在访问页面时判断:这种方式通常是在页面组件加载或渲染时进行的,即在用户已经导航到该页面后才进行检查。
使用AuthRoute
组件:判断是在路由跳转之前进行的。当用户尝试访问受保护的路由时,AuthRoute
组件会首先检查token,然后决定是否允许访问或进行重定向。
以上就是React封装高阶组件实现路由权限的控制详解的详细内容,更多关于React路由权限控制的资料请关注科站长其它相关文章!
栏 目:JavaScript
本文地址:https://www.fushidao.cc/wangluobiancheng/3137.html
您可能感兴趣的文章
- 02-11js中基本事件的总结(onclick、onblur、onchange等)
- 02-11详解如何在Node.js中使用中间件处理请求
- 02-11Vue3中Provide和Inject的用法及工作原理详解
- 02-11Vue+vant实现图片上传添加水印
- 02-11快速解决 keep-alive 缓存组件中定时器干扰问题
- 02-11uniapp 使用 tree.js 解决模型加载不出来的问题及解决方法
- 02-11基于uniapp vue3 的滑动抢单组件实例代码
- 02-10JavaScript 中的 Map使用指南
- 02-10vue3中使用print-js组件实现打印操作步骤
- 02-10Vue 中v-model的完整用法及v-model的实现原理解析


阅读排行
推荐教程
- 04-23JavaScript Array实例方法flat的实现
- 04-23THREE.JS使用TransformControls对模型拖拽的代码实例
- 04-23Vue3使用v-if指令进行条件渲染的实例代码
- 04-23vue3+ts项目搭建的实现示例
- 04-23JavaScript实现下载超大文件的方法详解
- 04-23vue如何使用pdf.js实现在线查看pdf文件功能
- 04-23vue.js调用python脚本并给脚本传数据
- 12-18使用JavaScript遍历输出页面中的所有元素的方法详解
- 04-23JS加密解密之保存到桌面书签
- 12-18Vue实现滚动加载更多效果的示例代码