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 相关文章推荐
jQuery autocomplate 自扩展插件、自动完成示例代码
Mar 28 Javascript
javascript自然分类法算法实现代码
Oct 11 Javascript
javascript正则表达式使用replace()替换手机号的方法
Jan 19 Javascript
JavaScript定时显示广告代码分享
Mar 02 Javascript
JavaScript中日期的相关操作方法总结
Oct 24 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
Nov 30 Javascript
js 轮播效果实例分享
Dec 28 Javascript
基于jQuery封装的分页组件
Jun 26 jQuery
Bootstrap table使用方法汇总
Nov 17 Javascript
jquery实现企业定位式导航效果
Jan 01 jQuery
基于Vue的ajax公共方法(详解)
Jan 20 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
Jul 23 jQuery
浅谈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实现的Cookies操作类实例
2014/09/24 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
PHP的PDO连接讲解
2019/01/24 PHP
php函数式编程简单示例
2019/08/08 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
asp 取文本框名称代码
2008/12/02 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
JS实现控制表格内指定单元格内容对齐的方法
2015/03/30 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
Python的历史与优缺点整理
2020/05/26 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
Python运算符+与+=的方法实例
2021/02/18 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
数据库的约束含义
2012/09/09 面试题
什么是View State?
2013/01/27 面试题
环境工程专业自荐信
2014/03/03 职场文书
公司合作意向书
2014/04/01 职场文书
团代会开幕词
2015/01/28 职场文书
追讨欠款律师函
2015/05/27 职场文书
纪委立案决定书
2015/06/24 职场文书