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 相关文章推荐
破解Session cookie的方法
Jul 28 Javascript
window.location和document.location的区别分析
Dec 23 Javascript
js中string转int把String类型转化成int类型
Aug 13 Javascript
jQuery右下角旋转环状菜单特效代码
Aug 10 Javascript
jQuery zTree加载树形菜单功能
Feb 25 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
微信小程序 定位到当前城市实现实例代码
Feb 23 Javascript
纯jQuery实现前端分页功能
Mar 23 jQuery
ES6中字符串string常用的新增方法小结
Nov 07 Javascript
vue 页面加载进度条组件实例
Feb 05 Javascript
JavaScript中字符串的常用操作方法及特殊字符
Mar 18 Javascript
vue 实现图片懒加载功能
Dec 31 Vue.js
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在Web开发领域的优势
2006/10/09 PHP
ajax php 实现写入数据库
2009/09/02 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
js常见表单应用技巧
2008/01/09 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
Python中AND、OR的一个使用小技巧
2015/02/18 Python
python计算两个数的百分比方法
2018/06/29 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
Python pandas用法最全整理
2019/08/04 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
Python 多进程、多线程效率对比
2020/11/19 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
楼面部长岗位职责范本
2014/02/14 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
付款委托书范本
2014/04/04 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
建筑节能汇报材料
2014/08/22 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
医院营销工作计划
2015/01/16 职场文书
素质拓展训练感想
2015/08/07 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
小学音乐课教学反思
2016/02/18 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python