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 相关文章推荐
修改发贴的编辑功能
Mar 07 Javascript
javascript实现 在光标处插入指定内容
May 25 Javascript
Jquery实现显示和隐藏的4种简单方式
Aug 28 Javascript
JavaScript中创建类/对象的几种方法总结
Nov 29 Javascript
JavaScript中的类与实例实现方法
Jan 23 Javascript
Jquery解析json字符串及json数组的方法
May 29 Javascript
JS实现简单的tab切换选项卡效果
Sep 21 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
Sep 24 Javascript
echarts3 使用总结(绘制各种图表,地图)
Jan 05 Javascript
JS获取本地地址及天气的方法实例小结
May 10 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 jQuery
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
Apr 27 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
php各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
openPNE常用方法分享
2011/11/29 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
JavaScript实用技巧(一)
2010/08/16 Javascript
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python3简单实例计算同花的概率代码
2017/12/06 Python
python样条插值的实现代码
2018/12/17 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
python防止随意修改类属性的实现方法
2019/08/21 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
护理学毕业生自荐信
2013/10/02 职场文书
cf战队收人口号
2014/06/21 职场文书
机电一体化专业求职信
2014/07/22 职场文书
体育教师个人总结
2015/02/09 职场文书
父亲去世追悼词
2015/06/23 职场文书