react高阶组件经典应用之权限控制详解


Posted in Javascript onSeptember 07, 2017

前言

所谓高级组件,即:接受一个组件作为参数,并且其返回值也为一个react组件

而大家应该都知道,权限控制算是软件项目中的常用功能了。在网站中,权限控制一般分为两个维度:页面级别和页面元素级别。

我们来说说页面元素粒度的权限控制。在某个页面中,有个“创建用户”的按钮,管理员才能看到。

一般想到的做法类似这样

class Page extends Component{
 render() {
 let hasCreatePermission = tool.getAuth("createUser"); 
 return (
  <div>
  {hasCreatePermission ? <Button>创建用户</Button> : null}
  </div>
 );
 }
}

在当前用户的权限列表中判断是否有“创建用户”的权限,然后控制按钮的显示和隐藏。

有一天,产品经理说,“没有权限的话,按钮就置灰”。

于是代码改成了这样:

render() {
 let hasCreatePermission = tool.getAuth("createUser"); 
 return (
  <div>
  {hasCreatePermission ? <Button>创建用户</Button> : <Button disabled={true}>创建用户</Button>}
  </div>
 );
 }

过了一个月,产品经理又说,“没有权限的话,按钮也正常展示,只是点击后给个'申请权限'的文案提示”。

额,硬着头皮改了下代码:

render() {
 let hasCreatePermission = tool.getAuth("createUser"); 
 return (
  <div>
  {hasCreatePermission ? <Button>创建用户</Button> : <Button onClick={()=>alert("权限不足,请找管理员小K申请")}>创建用户</Button>}
  </div>
 );
 }

如果网站中只有几个权限控制的按钮还好,想象一下,如果有50+这样的按钮,内心是不是想砍需求方?

需求方是不敢砍的。那么有没有一种方法,可以统一控制无权限时候的表现呢?

有。让我们来试试React的高阶组件吧。

export let wrapAuth = ComposedComponent =>class WrapComponent extends Component {
 // 构造
 constructor(props) {
  super(props);
 }

 static propTypes = {
  auth:PropTypes.string.isRequired,
 };

 render() {
  if (tool.getAuth(this.props.auth)) {
  return <ComposedComponent { ...this.props} />;
  } else {
  return null;
  }
 }
};

这个方法实际上是一个包装器,接受一个组件参数,根据权限,返回一个新的组件。

然后页面按钮的权限控制实现改成:

const AuthButton = wrapAuth(Button);
class Page extends Component{
 render() {
 return (
  <div>
  <AuthButton auth="createUser">创建用户</AuthButton>
  </div>
 );
 }
}

当遇到前面所说的需求变动时,现在只要把包装器里return null这行代码改成

return <ComposedComponent disabled={true} { ...this.props} />

或者

return <ComposedComponent onClick={()=>alert("权限不足,请找管理员小K申请")} { ...this.props} />

就行啦。

嗯,高阶组件让生活又美好了一些~

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript读取RSS数据
Jan 20 Javascript
jQuery学习笔记之控制页面实现代码
Feb 27 Javascript
推荐4个原生javascript常用的函数
Jan 12 Javascript
jQuery实现下拉框选择图片功能实例
Aug 08 Javascript
javascript实现checkbox复选框实例代码
Jan 10 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
Sep 28 Javascript
jQuery实现两个select控件的互移操作
Dec 22 Javascript
js中数组插入、删除元素操作的方法
Feb 15 Javascript
Vue 2.0 服务端渲染入门介绍
Mar 29 Javascript
Vue组件中的data必须是一个function的原因浅析
Sep 03 Javascript
Angular2实现的秒表及改良版示例
May 10 Javascript
Vue实现兄弟组件间的联动效果
Jan 21 Javascript
React + webpack 环境配置的方法步骤
Sep 07 #Javascript
微信小程序之页面拦截器的示例代码
Sep 07 #Javascript
基于js粘贴事件paste简单解析以及遇到的坑
Sep 07 #Javascript
微信小程序实现轮播图效果
Sep 07 #Javascript
使用mint-ui开发项目的一些心得(分享)
Sep 07 #Javascript
JavaScript+CSS相册特效实例代码
Sep 07 #Javascript
AngularJS 打开新的标签页实现代码
Sep 07 #Javascript
You might like
PHP输入流php://input介绍
2012/09/18 PHP
php正则表达式学习笔记
2015/11/13 PHP
jquery实现心算练习代码
2010/12/06 Javascript
Javascript将string类型转换int类型
2010/12/09 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
[50:50]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.20
2020/12/23 DOTA
python插入数据到列表的方法
2015/04/30 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
小学生爱国演讲稿
2014/04/25 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
离职保密承诺书
2014/05/28 职场文书
学生党员公开承诺书
2014/05/28 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
党员评议自我评价
2015/03/03 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js
MySQL学习之基础命令实操总结
2022/03/19 MySQL
python和anaconda的区别
2022/05/06 Python
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL