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 相关文章推荐
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
Feb 26 Javascript
javascript hasFocus使用实例
Jun 29 Javascript
javascript开发技术大全-第1章javascript概述
Jul 03 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
JavaScript实现简单图片翻转的方法
Apr 17 Javascript
js HTML5手机刮刮乐代码
Sep 29 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
Nov 18 Javascript
Vue.js实现输入框绑定的实例代码
Aug 24 Javascript
深入浅析Vue.js计算属性和侦听器
May 05 Javascript
微信小程序开发实现的IP地址查询功能示例
Mar 28 Javascript
Vue的状态管理vuex使用方法详解
Feb 05 Javascript
在react中使用vue的状态管理的方法示例
May 02 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 mssql 日期出现中文字符的解决方法
2009/03/10 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
JS模板实现方法
2013/04/03 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
python奇偶行分开存储实现代码
2018/03/19 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
迪拜航空官方网站:flydubai
2017/04/20 全球购物
前台接待的工作职责
2013/11/21 职场文书
致铅球运动员广播稿精选
2014/01/12 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
委托证明书
2014/09/17 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
2014年库房工作总结
2014/11/26 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python
python自然语言处理之字典树知识总结
2021/04/25 Python