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 相关文章推荐
javascript 从if else 到 switch case 再到抽象
Jul 17 Javascript
jquery 淡入淡出效果的简单实现
Feb 07 Javascript
javascript闭包的理解
Apr 01 Javascript
JavaScript中的parse()方法使用简介
Jun 12 Javascript
JS实现点击按钮获取页面高度的方法
Nov 02 Javascript
jquery判断页面网址是否有效的两种方法
Dec 11 Javascript
javascript实现文字无缝滚动效果
Aug 26 Javascript
浅谈Vue 初始化性能优化
Aug 31 Javascript
Vue组件和Route的生命周期实例详解
Feb 10 Javascript
JS实现倒计时图文效果
Nov 17 Javascript
JS实现将对象转化为数组的方法分析
Jan 21 Javascript
vue中使用vue-print.js实现多页打印
Mar 05 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
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
用文本文件制作留言板提示(上)
2006/10/09 PHP
php实现的SESSION类
2014/12/02 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
js array数组对象操作方法汇总
2019/03/18 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
python学习之编写查询ip程序
2016/02/27 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
python代码中怎么换行
2020/06/17 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
预备党员思想汇报范文
2014/01/11 职场文书
索桥的故事教学反思
2014/02/06 职场文书
银行授权委托书范本
2014/10/04 职场文书
元旦标语大全
2014/10/09 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技