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 相关文章推荐
Js 时间间隔计算的函数(间隔天数)
Nov 15 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
Jan 25 Javascript
简单的jQuery入门指引
Jul 28 Javascript
bootstrap-treeview自定义双击事件实现方法
Jan 09 Javascript
jQuery实现的网格线绘制方法
Jun 20 Javascript
D3.js实现直方图的方法详解
Sep 25 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
Mar 08 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
JavaScript模块详解
Dec 18 Javascript
vue-cli 如何打包上线的方法示例
May 08 Javascript
vue通过点击事件读取音频文件的方法
May 30 Javascript
vue-cli3环境变量与分环境打包的方法示例
Feb 18 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
基于mysql的论坛(5)
2006/10/09 PHP
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
用javascript实现自定义标签
2007/05/08 Javascript
My Desktop :) 桌面式代码
2008/12/29 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
2018/06/14 Javascript
Python中的ceil()方法使用教程
2015/05/14 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
python爬虫超时的处理的实例
2018/12/19 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Django继承自带user表并重写的例子
2019/11/18 Python
Python多进程编程multiprocessing代码实例
2020/03/12 Python
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
倩碧美国官网:Clinique美国
2016/07/20 全球购物
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
电子信息科学专业自荐信
2014/01/30 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
总经理任命书范本
2014/06/05 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
创业计划书之废品回收
2019/09/26 职场文书
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript