React学习笔记之高阶组件应用


Posted in Javascript onJune 02, 2018

是什么

高阶组件是一个函数,能够接受一个组件并返回一个新的组件。没有任何副作用。

为什么用

封装并抽离组件的通用逻辑,让此部分逻辑在组件间更好地被复用。

如何用

//hoc为我们的高阶组件,可以使用es7装饰器语法来使用高阶组件
//当然也可以不用es7,如:let hocHello = hoc(Hello),只是es7的语法更优雅一些。
//高阶组件可以叠加使用,可以对一个组件使用多个高阶组件
@hoc       
class Hello extends React.Component {
 //
}

如何实现

属性代理

下面的例子是最简单的一个实现

function hoc(ImportComponent) {
 return class Hoc extends React.Component {
 static displayName = `Hoc(${getDisplayName(ImportComponent)})` //displayName是设置高阶组件的显示名称
 render() {
  return <ImportComponent {...this.props} />
 }
 }
}

function getDisplayName(Component) {
 return Component.displayName || Component.name || "Component"
}

作用:操作prop,refs获取组件实例

注意事项:静态方法无法传递,必须手动复制;refs无法传递。

反向继承

下面的例子是最简单的一个实现

export function hoc(ImportComponent) {
 return class Hoc extends ImportComponent {
 static displayName = `Hoc(${getDisplayName(ImportComponent)})`
 render() {
  return super.render()
 }
 }
}

作用: 操作state;渲染劫持(操作它的render函数)

注意事项:通过继承ImportComponent,除了一些静态方法,包括生命周期,state,各种function,我们都可以得到。

原则

  1. 不要修改原组件,高阶组件只是通过组合的方式将子组件包装在容器组件中,是一个无副作用的纯函数。
  2. 不要在render方法内部使用高阶组件。
  3. 高阶组件可以向组件添加功能,但是不应该大幅度地改变功能。
  4. 为了方便调试,选择一个显示名称,表示它是高阶组件的结果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 多级checkbox选择效果
Aug 20 Javascript
javascript 多种搜索引擎集成的页面实现代码
Jan 02 Javascript
JavaScript 继承使用分析
May 12 Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 Javascript
jquery中checkbox全选失效的解决方法
Dec 26 Javascript
7个让JavaScript变得更好的注意事项
Jan 28 Javascript
jQuery动画与特效详解
Feb 01 Javascript
JavaScript实现更改网页背景与字体颜色的方法
Feb 02 Javascript
详解JavaScript对象序列化
Jan 19 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
Feb 15 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
Jul 22 Javascript
vue实现移动端触屏拖拽功能
Aug 21 Javascript
浅谈node中的cluster集群
Jun 02 #Javascript
详解AngularJS 过滤器的使用
Jun 02 #Javascript
简化vuex的状态管理方案的方法
Jun 02 #Javascript
深入了解javascript 数组的sort方法
Jun 01 #Javascript
js 数组详细操作方法及解析合集
Jun 01 #Javascript
vue 中动态绑定class 和 style的方法代码详解
Jun 01 #Javascript
一个简单的node.js界面实现方法
Jun 01 #Javascript
You might like
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
基于Python List的赋值方法
2018/06/23 Python
基于python实现文件加密功能
2020/01/06 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
建龙钢铁面试总结
2014/04/15 面试题
求职意向书范文
2014/04/01 职场文书
巾帼文明岗申报材料
2014/05/01 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书