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使用过程中需要注意的地方和一些基本语法
Aug 26 Javascript
jquery的相对父元素和相对文档定位示例代码
Aug 02 Javascript
js校验表单后提交表单的三种方法总结
Feb 28 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
Sep 15 Javascript
详解JavaScript语言的基本语法要求
Nov 20 Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 Javascript
jquery实现可旋转可拖拽的文字效果代码
Jan 27 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
Jun 09 Javascript
vue脚手架中配置Sass的方法
Jan 04 Javascript
微信小程序实现topBar底部选择栏效果
Jul 20 Javascript
Vue组件间通信 Vuex的用法解析
Aug 05 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实现jQuery扩展函数
2009/10/30 PHP
php表单提交问题的解决方法
2011/04/12 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
Git命令之分支详解
2021/03/02 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
2018/05/30 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
Python File readlines() 使用方法
2018/03/19 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
python定义具名元组实例操作
2021/02/28 Python
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
新闻记者实习自我鉴定
2013/09/19 职场文书
客服实习的个人自我鉴定
2013/10/20 职场文书
应用数学自荐书范文
2013/11/24 职场文书
诚信考试标语
2014/06/24 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
云冈石窟导游词
2015/02/04 职场文书
2016十一国庆节感言
2015/12/09 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle