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玩转游戏物理(一)运动学模拟与粒子系统
Jun 19 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
Apr 27 Javascript
jQuery中prepend()方法使用详解
Aug 11 Javascript
js获取Html元素的实际宽度高度的方法
May 19 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
Jul 14 Javascript
原生js实现焦点轮播图效果
Jan 12 Javascript
JS之if语句对接事件动作逻辑(详解)
Jun 28 Javascript
深入理解vue2.0路由如何配置问题
Jul 18 Javascript
Vue中计算属性computed的示例解读
Jul 26 Javascript
vue动态绑定class选中当前列表变色的方法示例
Dec 19 Javascript
JS实现音乐钢琴特效
Jan 06 Javascript
Vue实现多页签组件
Jan 14 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
图形数字验证代码
2006/10/09 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
浅析Python多线程下的变量问题
2015/04/28 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
Python 字典与字符串的互转实例
2017/01/13 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
导入tensorflow时报错:cannot import name 'abs'的解决
2019/10/10 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
Pytorch转tflite方式
2020/05/25 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
python3实现简单飞机大战
2020/11/29 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
安全大检查反思材料
2014/01/31 职场文书
初二学习计划书范文
2014/04/27 职场文书
高中教师考核方案
2014/05/18 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
刑事辩护词范文
2015/05/21 职场文书