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 按回车键相应按钮提交事件
Nov 02 Javascript
JS动态获取当前时间,并写到特定的区域
May 03 Javascript
javascript异步编程代码书写规范Promise学习笔记
Feb 11 Javascript
理解javascript中的原型和原型链
Jul 30 Javascript
JS实现霓虹灯文字效果的方法
Aug 06 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
Jan 17 Javascript
JavaScript的事件机制详解
Jan 17 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
May 17 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
Dec 28 Javascript
JavaScript创建防篡改对象的方法分析
Dec 30 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
用PHP和ACCESS写聊天室(五)
2006/10/09 PHP
php和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
php xhprof使用实例详解
2019/04/15 PHP
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
使用javascript插入样式
2016/03/14 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS