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 相关文章推荐
Add a Table to a Word Document
Jun 15 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
Aug 06 Javascript
jQuery 动态云标签插件
Nov 11 Javascript
JS+CSS实现仿msn风格选项卡效果代码
Oct 22 Javascript
JavaScript提升性能的常用技巧总结【经典】
Jun 20 Javascript
详解AngularJs ui-router 路由的简单介绍
Apr 26 Javascript
Vue2几种常见开局方式详解
Sep 09 Javascript
tangram.js库实现js类的方式实例分析
Jan 06 Javascript
解决vue-router中的query动态传参问题
Mar 20 Javascript
Taro集成Redux快速上手的方法示例
Jun 21 Javascript
react 移动端实现列表左滑删除的示例代码
Jul 04 Javascript
浅析Vue中拆分视图层代码的5点建议
Aug 15 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
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
在openSUSE42.1下编译安装PHP7 的方法
2015/12/24 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
实现高性能javascript的注意事项
2019/05/27 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
使用python解析xml成对应的html示例分享
2014/04/02 Python
在Python中使用AOP实现Redis缓存示例
2017/07/11 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
详解Python核心对象类型字符串
2018/02/11 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
Python3自动生成MySQL数据字典的markdown文本的实现
2020/05/07 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
业务经理的岗位职责
2013/11/16 职场文书
高中考试作弊检讨书
2014/01/14 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
2014迎新年晚会策划方案
2014/02/23 职场文书
四年级评语大全
2014/04/21 职场文书
社区平安建设汇报材料
2014/08/14 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
2016教师国培研修感言
2015/12/08 职场文书