React 高阶组件入门介绍


Posted in Javascript onJanuary 11, 2018

高阶组件的定义

HoC 不属于 React 的 API,它是一种实现模式,本质上是一个函数,接受一个或多个 React 组件作为参数,返回一个全新的 React 组件,而不是改造现有的组件,这样的组件被称为高阶组件。开发过程中,有的功能需要在多个组件类复用时,这时可以创建一个 Hoc。

基本用法

包裹方式

const HoC = (WrappendComponent) => {
 const WrappingComponent = (props) => (
  <div className="container">
   <WrappendComponent {...props} />
  </div>
 );
 return WrappingComponent;
};

上述代码中,接受 WrappendComponent 作为参数,此参数就是将要被 HoC 包装的普通组件,在 render 中包裹一个 div,赋予它 className 属性,最终产生的 WrappingComponent 和 传入的 WrappendComponent 是两个完全不同的组件。

在 WrappingComponent 中,可以读取、添加、编辑、删除传给 WrappendComponent 的 props,也可以用其它元素包裹 WrappendComponent,用来实现封装样式、添加布局或其它操作。

组合方式

const HoC = (WrappedComponent, LoginView) => {
 const WrappingComponent = () => {
  const {user} = this.props; 
  if (user) {
   return <WrappedComponent {...this.props} />
  } else {
   return <LoginView {...this.props} />
  }
 };
 return WrappingComponent;
};

上述代码中有两个组件,WrappedComponent 和 LoginView,如果传入的 props 中存在 user,则正常显示的 WrappedComponent 组件,否则显示 LoginView 组件,让用户去登录。HoC 传递的参数可以为多个,传递多个组件定制新组件的行为,例如用户登录状态下显示主页面,未登录显示登录界面;在渲染列表时,传入 List 和 Loading 组件,为新组件添加加载中的行为。

继承方式

const HoC = (WrappendComponent) => {
 class WrappingComponent extends WrappendComponent {
  render() (
   const {user, ...otherProps} = this.props;
   this.props = otherProps;
   return super.render();
  }
 }
 return WrappingComponent;
};

WrappingComponent 是一个新组件,它继承自 WrappendComponent,共享父级的函数和属性。可以使用 super.render() 或者 super.componentWillUpdate() 调用父级的生命周期函数,但是这样会让两个组件耦合在一起,降低组件的复用性。

React 中对组件的封装是按照最小可用单元的思想来进行封装的,理想情况下,一个组件只做一件事情,符合 OOP 中的单一职责原则。如果需要对组件的功能增强,通过组合的方式或者添加代码的方式对组件进行增强,而不是修改原有的代码。

注意事项

不要在 render 函数中使用高阶组件

render() {
 // 每一次render函数调用都会创建一个新的EnhancedComponent实例
 // EnhancedComponent1 !== EnhancedComponent2
 const EnhancedComponent = enhance(MyComponent);
 // 每一次都会使子对象树完全被卸载或移除
 return <EnhancedComponent />;
}

React 中的 diff 算法会比较新旧子对象树,确定是否更新现有的子对象树或丢掉现有的子树并重新挂载。

必须将静态方法做拷贝

// 定义静态方法
WrappedComponent.staticMethod = function() {/*...*/}
// 使用高阶组件
const EnhancedComponent = enhance(WrappedComponent);

// 增强型组件没有静态方法
typeof EnhancedComponent.staticMethod === 'undefined' // true

Refs属性不能传递

HoC中指定的 ref,并不会传递到子组件,需要通过回调函数使用 props 传递。

参考链接

高阶组件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用TextRange获取输入框中光标的位置的代码
Mar 08 Javascript
用jquery实现输入框获取焦点消失文字
Apr 27 Javascript
详谈JavaScript 匿名函数及闭包
Nov 14 Javascript
JQuery中DOM事件绑定用法详解
Jun 13 Javascript
javascript验证内容为数字以及长度为10的简单实例
Aug 20 Javascript
使用jquery如何获取时间
Oct 13 Javascript
JS插件plupload.js实现多图上传并显示进度条
Nov 29 Javascript
Bootstrap table使用方法详细介绍
Dec 09 Javascript
JavaScript常见的五种数组去重的方式
Dec 15 Javascript
微信小程序 数据封装,参数传值等经验分享
Jan 09 Javascript
使用Require.js封装原生js轮播图的实现代码
Jun 15 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
Aug 01 Javascript
基于react后端渲染模板引擎noox发布使用
Jan 11 #Javascript
Router解决跨模块下的页面跳转示例
Jan 11 #Javascript
vuex 使用文档小结篇
Jan 11 #Javascript
js判断传入时间和当前时间大小实例(超简单)
Jan 11 #Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
Jan 11 #Javascript
纯js代码生成可搜索选择下拉列表的实例
Jan 11 #Javascript
web前端vue之vuex单独一文件使用方式实例详解
Jan 11 #Javascript
You might like
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
php购物车实现方法
2015/01/03 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
jQuery ajax cache缓存问题
2010/07/01 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
Python实现抢购IPhone手机
2018/02/07 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
python使用matplotlib画饼状图
2018/09/25 Python
python实现三次样条插值
2018/12/17 Python
Python使用folium excel绘制point
2019/01/03 Python
python导入pandas具体步骤方法
2019/06/23 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
如何利用find命令查找文件
2016/11/18 面试题
网络程序员自荐信
2014/01/25 职场文书
预备党员承诺书
2014/03/25 职场文书
教室布置标语
2014/06/26 职场文书
治庸问责心得体会
2014/09/12 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
自查自纠工作总结
2014/10/15 职场文书
还款承诺书范本
2015/01/20 职场文书
2015年毕业生自荐信范文
2015/03/24 职场文书
裁员通知
2015/04/25 职场文书
严以律己学习心得体会
2016/01/13 职场文书