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 相关文章推荐
JS 的应用开发初探(mootools)
Dec 19 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
Mar 18 Javascript
JS控制网页动态生成任意行列数表格的方法
Mar 09 Javascript
详解AngularJS中的依赖注入机制
Jun 17 Javascript
javascript实现textarea中tab键的缩排处理方法
Jun 26 Javascript
JS实现根据文件字节数返回文件大小的方法
Aug 02 Javascript
运用js教你轻松制作html音乐播放器
Apr 17 Javascript
jquery代码规范让代码越来越好看
Feb 03 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
Mar 13 Javascript
centos 上快速搭建ghost博客方法分享
May 23 Javascript
小程序实现人脸识别功能(百度ai)
Dec 23 Javascript
mocha的时序规则讲解
Feb 16 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
PHP页面间传递参数实例代码
2008/06/05 PHP
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
php循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
vue.js从安装到搭建过程详解
2017/03/17 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
python入门前的第一课 python怎样入门
2018/03/06 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
体育专业个人的求职信范文
2013/09/21 职场文书
煤矿班组长的职责
2013/12/25 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
学习心理学心得体会
2016/01/22 职场文书
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技