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的函数重名看其初始化方式
Mar 08 Javascript
js DOM模型操作
Dec 28 Javascript
Javascript匿名函数的一种应用 代码封装
Jun 27 Javascript
jquery特效 幻灯片效果示例代码
Jul 16 Javascript
jQuery创建DOM元素实例解析
Jan 19 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
Sep 04 Javascript
微信小程序中使用javascript 回调函数
May 11 Javascript
详解如何去除vue项目中的#——History模式
Oct 13 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
vue中render函数的使用详解
Oct 12 Javascript
JavaScript实现小球沿正弦曲线运动
Sep 07 Javascript
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
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
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
webpack配置之后端渲染详解
2017/10/26 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
Python实现端口检测的方法
2018/07/24 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
毕业生找工作推荐信
2013/11/21 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
课外活动总结范文
2014/07/09 职场文书
公司管理制度范本
2015/08/03 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang