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 相关文章推荐
神奇的代码 通杀各种网站-可随意修改复制页面内容
Jul 17 Javascript
js监听输入框值的即时变化onpropertychange、oninput
Jul 13 Javascript
javascript判断office版本示例
Apr 11 Javascript
jquery-syntax动态语法着色示例代码
May 14 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
Dec 18 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
Apr 29 Javascript
JavaScript函数节流概念与用法实例详解
Jun 20 Javascript
JS事件添加和移出的兼容写法示例
Jun 20 Javascript
简单谈谈axios中的get,post方法
Jun 25 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
Jun 03 Javascript
JavaScript实现左右滚动电影画布
Feb 06 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 中的批处理的实现
2007/06/14 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
MySQL数据源表结构图示
2008/06/05 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
PHP数组循环操作详细介绍 附实例代码
2013/02/03 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
JObj预览一个JS的框架
2008/03/13 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
[10:24]郎朗助力完美“圣”典,天籁交织奏响序曲
2016/12/18 DOTA
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
python字符串中的单双引
2017/02/16 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
房产代理公证处委托书
2014/04/04 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书