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 相关文章推荐
SUN的《AJAX与J2EE》全文译了
Feb 23 Javascript
javascript 面向对象全新理练之原型继承
Dec 03 Javascript
js 字符串转化成数字的代码
Jun 29 Javascript
Jquery中对数组的操作代码
Aug 12 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
Jan 30 Javascript
分享Javascript中最常用的55个经典小技巧
Nov 29 Javascript
JavaScript将字符串转换为整数的方法
Apr 14 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
Aug 24 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 Javascript
Vue.js点击切换按钮改变内容的实例讲解
Aug 22 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 Javascript
微信小程序实现图片压缩
Dec 03 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
javascript window对象属性整理
2009/10/24 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
python 生成器需注意的小问题
2020/09/29 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
大学生新闻专业个人自我评价
2013/11/12 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
青年文明号复核材料
2014/02/11 职场文书
租房协议书怎么写
2014/04/10 职场文书
学习雷锋倡议书
2014/04/15 职场文书
5s推行计划书
2014/05/06 职场文书
收款委托书范本
2014/09/11 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
2015初一年级组工作总结
2015/07/24 职场文书