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常见问题整理(持续更新)
Aug 06 Javascript
jQuery使用cookie与json简单实现购物车功能
Apr 15 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
Jun 16 Javascript
JS排序之选择排序详解
Apr 08 Javascript
详解用Node.js实现Restful风格webservice
Sep 29 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
Oct 29 jQuery
详解如何在你的Vue项目配置vux
Jun 04 Javascript
js根据json数据中的某一个属性来给数据分组的方法
Oct 08 Javascript
JavaScript常见事件处理程序实例总结
Jan 05 Javascript
Vue-CLI项目中路由传参的方式详解
Sep 01 Javascript
javascript canvas时钟模拟器
Jul 13 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
Sep 11 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简单生成缩略图相册的方法
2015/07/29 PHP
window.open的功能全解析
2006/10/10 Javascript
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
最短的IE判断代码
2011/03/13 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
vue穿梭框实现上下移动
2021/01/29 Vue.js
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
Python常用模块用法分析
2014/09/08 Python
Python网络编程详解
2017/10/31 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
销售团队获奖感言
2014/08/14 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
Django路由层如何获取正确的url
2021/07/15 Python
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
各种货币符号快捷输入
2022/02/17 杂记
javascript的var与let,const之间的区别详解
2022/02/18 Javascript