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 相关文章推荐
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
Sep 21 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
Oct 11 Javascript
javascript常用经典算法实例详解
Nov 25 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
May 11 Javascript
JS 调试中常见的报错问题解决方法
May 20 Javascript
提高Node.js性能的应用技巧分享
Aug 10 Javascript
jqgrid实现简单的单行编辑功能
Sep 30 Javascript
jquery实现的简单轮播图功能【适合新手】
Aug 17 jQuery
Vue2.0生命周期的理解
Aug 20 Javascript
vue-cli设置css不生效的解决方法
Feb 07 Javascript
vue中使用v-for时为什么不能用index作为key
Apr 04 Javascript
js实现拖拽元素选择和删除
Aug 25 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
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
试用php中oci8扩展
2015/06/18 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
PHP实现的函数重载功能示例
2018/08/03 PHP
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
python实现整数的二进制循环移位
2019/03/08 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
医科大学生毕业的自我评价分享
2013/11/12 职场文书
预备党员思想汇报
2014/01/08 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
感谢师恩主题班会
2015/08/17 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书