【react18】你可能要知道的关于权限按钮效果的优雅实现

server/2024/11/15 3:49:35/

权限按钮,跟权限路由一样,不同的角色登录app,展示不同的菜单页面,一个页面内管理可以进行删除记录等操作,普通的成员之有阅读的权限,这就是权限按钮需要做的事。

实现效果

在这里插入图片描述
在这里插入图片描述

  • 三个按钮全显示。

在这里插入图片描述
在这里插入图片描述

  • 后端没有返回该用户的新增权限
    在这里插入图片描述

在这里插入图片描述

  • 与前面的原理差不多。

代码实现

思路运用HOC函数来实现,对按钮组件进行提前处理,从后端获取用户的权限数据,然后再进行相关的前端配置.

  • WithAuthButton.js
import { useSelector } from 'react-redux'
function WithAuthButton(props) {const permission = useSelector((state) => state.getIn(['base', 'info']))const permissionArr = permission.get('permission').toJS()const { children, auth } = props//后端返回的无权限数据h,或者是前端配置的权限数据与后端返回的数据不匹配,则不显示const isShow = permissionArr.some((item) => auth.includes(item))if (!permissionArr.length || !isShow) return null// 否则就展示数据return { ...children }
}
export default WithAuthButton
  • 使用
import { Button, Dialog, setDefaultConfig, Space, Toast } from 'antd-mobile'
import { http } from '../api/request'
import { useEffect } from 'react'
import { useSelector } from 'react-redux'
import WithAuthButton from '../components/WithAuthButton'
function Home() {const dataList = useSelector((state) => state.getIn(['store', 'list']))const count = useSelector((state) => state.getIn(['store', 'count']))return (<div className='home-box'><br /><Space><Button onClick={() => Toast.info('点击了按钮')}>点我</Button><WithAuthButton auth={['add']}><Button color='primary'>新增</Button></WithAuthButton><WithAuthButton auth={['read']}><Button color='primary'>显示</Button></WithAuthButton><WithAuthButton auth={['delete']}><Button color='danger'>删除</Button></WithAuthButton></Space></div>)
}
export default Home

这样我们就实现了权限按钮的控制。


http://www.ppmy.cn/server/141201.html

相关文章

Java NIO实现高性能HTTP代理

NIO采用多路复用IO模型&#xff0c;相比传统BIO&#xff08;阻塞IO&#xff09;&#xff0c;通过轮询机制检测注册的Channel是否有事件发生&#xff0c;可以实现一个线程处理客户端的多个连接&#xff0c;极大提升了并发性能。 在5年前&#xff0c;本人出于对HTTP正向代理的好…

Flink介绍

什么是Flink Apache Flink 是一个开源的流处理框架&#xff0c;用于处理实时数据流和批处理数据。它具有高吞吐量、低延迟和容错性强的特点&#xff0c;适用于各种实时数据处理场景&#xff0c;如实时分析、事件驱动应用和数据管道等。Flink 提供了丰富的 API&#xff0c;支持…

基础数据结构——队列(链表实现)

队列的性质 先进先出&#xff08;FIFO - First In First Out&#xff09;&#xff1a;最先加入队列的元素最先被移出后进后出&#xff08;后来的元素排在队尾&#xff09;只允许在队尾插入元素&#xff0c;在队首删除元素具有先来先服务的特点 链表实现队列 和之前创建链表相…

【ROS2】usb摄像头识别二维码

1、安装依赖 1)安装usb摄像头 ROS包: sudo apt install ros-humble-usb-cam2)安装二维码识别库 sudo apt install libzbar-dev3)安装opencv cv::Mat和sensor_msgs转换库 sudo apt install ros-humble-cv-bridge4)安装pydantic库 pip3 install pydantic==1.10.7注意版…

ImportError: cannot import name ‘packaging‘ from ‘pkg_resources‘ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 ROS-Noetic 一、问题描述 自己在通过 pip install 安装module时 &#xff08;使用的是 pip install mmcv&#xff09;遇到如下问题&#xff1a; ImportError: cannot …

rust字符串

Rust字符串 在Rust中&#xff0c;字符串(string)是一种非常重要的数据类型&#xff0c;用于表示文本数据。Rust中的字符串有两种类型&#xff1a;String和&str。 String类型是可变的、堆分配的字符串类型&#xff0c;可以动态地增加或删除字符。例如&#xff0c;下面创建了…

Vite与Vue Cli的区别与详解

它们的功能非常相似&#xff0c;都是提供基本项目脚手架和开发服务器的构建工具。 主要区别 Vite在开发环境下基于浏览器原生ES6 Modules提供功能支持&#xff0c;在生产环境下基于Rollup打包&#xff1b; Vue Cli不区分环境&#xff0c;都是基于Webpack。 在生产环境下&…

初识Electron 进程通信

概述 Electron chromium nodejs native API&#xff0c;也就是将node环境和浏览器环境整合到了一起&#xff0c;这样就构成了桌面端&#xff08;chromium负责渲染、node负责操作系统API等&#xff09; 流程模型 预加载脚本&#xff1a;运行在浏览器环境下&#xff0c;但是…