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 处理 URL 的两个函数代码
Aug 13 Javascript
JQuery验证工具类搜集整理
Jan 16 Javascript
jQuery获得指定元素坐标的方法
Apr 14 Javascript
jQuery里filter()函数与find()函数用法分析
Jun 24 Javascript
KnockoutJS 3.X API 第四章之click绑定
Oct 10 Javascript
小程序实现列表点赞功能
Nov 02 Javascript
JS中call()和apply()的功能及用法实例分析
Jun 28 Javascript
基于layui的table插件进行复选框联动功能的实现方法
Sep 19 Javascript
Vue通过provide inject实现组件通信
Sep 03 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
Sep 07 Javascript
原生js实现分页效果
Sep 23 Javascript
Javascript之datagrid查询详解
Sep 15 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
用session做客户验证时的注意事项
2006/10/09 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
Python对象转JSON字符串的方法
2016/04/27 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
函授生自我鉴定
2014/03/25 职场文书
毕业生工作求职信
2014/06/30 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
世界文化遗产导游词
2019/08/07 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js