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 相关文章推荐
利用404错误页面实现UrlRewrite的实现代码
Aug 20 Javascript
javascript new fun的执行过程
Aug 05 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
Jun 11 Javascript
jQuery 监控键盘一段时间没输入
Apr 22 Javascript
JavaScript数组操作函数汇总
Aug 05 Javascript
Node.js 实现简单小说爬虫实例
Nov 18 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
Feb 28 Javascript
JavaScript引用类型Object常见用法实例分析
Aug 08 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
Aug 30 Javascript
深入分析element ScrollBar滚动组件源码
Jan 22 Javascript
jQuery+ajax实现批量删除功能完整示例
Jun 06 jQuery
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 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 文件上传模型,支持多文件上传
2009/08/13 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
Django基础之Model操作步骤(介绍)
2017/05/27 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
西班牙购买行李箱和背包网站:Maletas Greenwich
2019/10/08 全球购物
正隆泰信息技术有限公司上机题
2012/06/14 面试题
事业单位接收函
2014/01/10 职场文书
小学生读书感言
2014/02/12 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
面试复试通知单
2015/04/24 职场文书
高温慰问简报
2015/07/21 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python