IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> react实现不同用户角色可访问不同的页面(路由权限管理) -> 正文阅读

[JavaScript知识库]react实现不同用户角色可访问不同的页面(路由权限管理)

需求:

可制定不同的角色以及对应角色可以访问的页面

实现:

1.登录后根据用户角色字段获取该角色能够访问的页面路径
2.将能够访问的路径存储到全局(这里用的是localstorage)
3.在涉及权限的路由下使用自定义路由组件PrivateRoute代替Route(关于某一菜单/路径是否是需要权限的页面,可以在配置菜单数组的时候新增一个字段,值为true/false对应是否需要权限)

自定义私有路由组件

/**
 * 涉及权限的路由展示配置
 * 有权限访问/view/profile则有权限访问/view,有权限访问/view不一定能访问/view/profile
 */
import React from "react";
import { Route, withRouter, RouteComponentProps } from "react-router-dom";
interface PrivateRouteProps extends RouteComponentProps {
  exact?: boolean; //Route组件的exact属性
  path: string; //路由路径
  component: React.ComponentType; //有访问权限时展示的组件
  noPermissionComponent?: React.ComponentType; //没有访问权限时展示的组件
}
interface PrivateRouteStates {
  authMenu: any[];
}
class PrivateRoute extends React.Component<
  PrivateRouteProps,
  PrivateRouteStates
> {
  constructor(props) {
    super(props);
    const authMen = window.sessionStorage.getItem("authMenu");
    this.state = {
      authMenu: JSON.parse(authMen) || []
    };
  }
  //减少不必要的更新
  // shouldComponentUpdate(nextProps) {
  //可能存在/view/sysMng/web/portal/:catalogue形式的路径,所以不能通过此方法判断路由是否变化
  //   // return nextProps.path !== this.props.path
  // }
  render() {
    //为了用户在加入购物车时登录后可以获得最新的权限信息,故不将authMenu放在state中
    const authMenu =
      JSON.parse(window.sessionStorage.getItem("authMenu")) || [];
    let accessible = authMenu.find(authpath => {
      return authpath.includes(this.props.path);
    });
    if (!accessible && this.props.path.includes("/:")) {
      accessible = authMenu.find(authpath => {
        return authpath.includes(this.props.location.pathname);
      });
    }
    const { exact, path, component, noPermissionComponent } = this.props;
    return accessible ? (
      <Route path={path} component={component} exact={exact} />
    ) : (
      <Route
        path={path}
        component={noPermissionComponent ? noPermissionComponent : NoPermission}
        exact={exact}
      />
    );
  }
}
class NoPermission extends React.Component {
  constructor(props) {
    super(props);
  }
  render() {
    return (
      <div
        style={{ textAlign: "center", padding: "0.3rem", fontSize: "0.2rem" }}
      >
        您暂时没有权限访问此页面,如果您还未登录,请先登录;如果您已登录,可联系管理员设置权限
      </div>
    );
  }
}
export default withRouter(PrivateRoute);


私有路由的使用:
在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 11:54:34  更:2021-10-17 11:56:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 21:28:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码