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 相关文章推荐
静态页面的值传递(三部曲)
Sep 25 Javascript
CLASS_CONFUSION JS混淆 全源码
Dec 12 Javascript
Json对象与Json字符串互转(4种转换方式)
Mar 27 Javascript
将两个div左右并列显示并实现点击标题切换内容
Oct 22 Javascript
常用jQuery选择器总结
Jul 11 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
May 28 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
Dec 02 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
Mar 21 jQuery
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
浅谈 vue 中的 watcher
Dec 04 Javascript
react build 后打包发布总结
Aug 24 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
Nov 01 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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
海量经典的jQuery插件集合
2010/01/12 Javascript
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
基于jquery封装的一个js分页
2011/11/15 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
python使用mailbox打印电子邮件的方法
2015/04/30 Python
关于Django外键赋值问题详解
2017/08/13 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
Python numpy 点数组去重的实例
2018/04/18 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
Python列表list操作相关知识小结
2020/01/29 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
大学生实习感言
2014/01/16 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
有关环保的标语
2014/06/13 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
自主招生专家推荐信
2015/03/26 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
Ruby处理CSV数据方法详解
2022/04/18 Ruby