1、高阶组件是什么

高阶组件是一个函数,但 参数 和 返回值 为 组件。 高阶组件是包装了另外一个 React 组件的 React 组件、它可以大幅度的简化代码量、使我们更多的去复用代码; 高阶组件可以解决组件冗余的问题,可以使多个组件具有相同或类似的方法。

2、高阶组件用途

1): 最常用之属性代理:

/* eslint-disable*/
import React, { createRef, Component } from 'react';const firstHoc = (WrappedComponent) => {return class extends Component {get hocComponent() {return this.hocRef.current;}constructor(props) {super(props);this.state = {userId: '',};this.logState = this.logState.bind(this);this.hocRef = createRef();}componentWillMount() {const userId = localStorage.getItem('userId');this.setState({userId,});}logState() {console.log('==============>', this);console.log('====>', this.hocComponent.state);}render() {const { userId } = this.state;const hocProps = {logState: this.logState,userId,};return <WrappedComponent ref={this.hocRef} {...this.props} {...hocProps} />;}};
};class Test extends Component {constructor() {super();this.state = {hocTest: '我是hocTest',};}handleView = () => {console.log(this.props.userId);this.props.logState();};render() {return (<divonClick={() => {this.handleView();}}>Test</div>);}
}export default firstHoc(Test);

以上例子是导出了 hoc 组件中的 logState 通过 firstHoc 包裹的组件、都可以直接调用 this.props.logState 去打印自身组件的 state 数据

即抽取一些可复用的方法,或属性导出,在子组件内通过 this.porps 访问

2): 抽离 state:

/* eslint-disable max-classes-per-file */
// 普通组件Login
import React, { Component } from 'react';const formCreate = (WrappedComponent) =>class extends Component {constructor() {super();this.state = {fields: {},};}changeFiled = (e, key) => {const { fields } = this.state;fields[key] = e.target.value;this.setState({fields,});};handleSubmit = () => {console.log(this.state.fields);};render() {const props = {...this.props,handleSubmit: this.handleSubmit,changeFiled: this.changeFiled,};return <WrappedComponent {...props} />;}};class Login extends Component {render() {return (<div><div><label id="username">账户</label><input onChange={(e) => this.props.changeFiled(e, 'username')} /></div><div><label id="password">密码</label><input onChange={(e) => this.props.changeFiled(e, 'password')} /></div><div onClick={this.props.handleSubmit}>提交</div><div>other content</div></div>);}
}
export default formCreate(Login);

把子组件中重复功能(如一些简单的受控表单、使用 state 控制输入 value)的状态、及设置 state 抽离在高阶组件中统一管理! 最后在子组件中通过 this.porps.methodsName 获取

3): 统一容器:

const HocTest = (WrappedComponent) =>class extends Component {render() {return (<div style={{ background: '#fff' }}>头部<WrappedComponent {...props} />尾部</div>);}};

可以在高阶组件中套一层 div 做一些公用样式… 其实还有很多作用

4): 反向继承(渲染劫持):

const withLoading(WrappedComponent) {return class extends WrappedComponent {render() {if(this.props.isLoading) {return <Loading />;} else {return super.render();}}};
}

在 hoc 中直接继承传进来的组件(wrapComponent),在 render 中做一些判断,如是否处于 loading 状态,渲染 loading 或者直接渲染原来内容 super.render();

其实在工作中我们能遇到的使用高阶组件情景很多,就看我们怎么使用;

react 高阶组件详解相关推荐

  1. react高阶组件详解

    1 引言 高阶组件( higher-order component ,HOC )是 React 中复用组件逻辑的一种进阶技巧.它本身并不是 React 的 API,而是一种 React 组件的设计理念 ...

  2. React的高阶组件详解

    文章目录 React的高阶组件 高阶组件基本介绍 高阶组件使用过程 高阶组件应用场景 高阶组件的意义 React的高阶组件 高阶组件基本介绍 什么是高阶组件呢? 在认识高阶组价之前, 我们先来回顾一下 ...

  3. react进阶系列 - 高阶组件详解四:高阶组件的嵌套使用

    前面有讲到过很多页面会在初始时验证登录状态与用户角色.我们可以使用高阶组件来封装这部分验证逻辑.封装好之后我们在使用的时候就可以如下: export default withRule(Home); 但 ...

  4. R6- React高阶组件详解

    看题目感觉好高级的样子,千万不要被名字吓到,它一点都不高深. 按照惯例先上图,这一章的概览: 1.从高阶函数说起 维基百科对高阶函数的定义: 在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数 ...

  5. react高阶组件 事例 源码

    记录一下 高阶组件 的建立(也希望能帮助看的这篇文章的人),这篇文章主要是 教你构建一个hoc的事例,更详细深入的还是需要继续看其他文章 高阶组件通过包裹被传入的React组件,经过处理,最终返回(r ...

  6. React高阶组件_阶段1

    react高阶组件_阶段1 作用: 个人总结的高阶组件设计的作用主要有两点, 这里直接使用装饰器方式 非装饰器使用请结合我的博文"react基础梳理_阶段1"中的"自定义 ...

  7. react高阶组件和hooks

    1. react高阶组件 1.1 高阶组件的概念 高阶组件(Higher Order Component,简称:HOC ): 是 React 中用于重用组件逻辑的高级技术, 它本身不是react中的组 ...

  8. react实现汉堡_利用 React 高阶组件实现一个面包屑导航

    什么是 React 高阶组件 React 高阶组件就是以高阶函数的方式包裹需要修饰的 React 组件,并返回处理完成后的 React 组件.React 高阶组件在 React 生态中使用的非常频繁, ...

  9. [react] 高阶组件(HOC)有哪些优点和缺点?

    [react] 高阶组件(HOC)有哪些优点和缺点? HOC 优点 通过传递props去影响内层组件的状态,不直接改变内层组件的状态,降低了耦合度 缺点 组件多层嵌套, 增加复杂度与理解成本 ref隔 ...

最新文章

  1. 【划分树】 POJ 2104 HDU 2665 K-th Number 裸题
  2. Spring @Aspect切面参数传递
  3. HDU - 3026 Chinese Chess(二分图的必经边)
  4. 磁盘io php,PHP CURL如何处理上传内存中文件,避免磁盘IO开销
  5. 新版征信报告实施之后,信用卡养卡套现真的要凉凉了?
  6. 【ArcGIS微课1000例】0009:ArcGIS影像拼接(镶嵌、镶嵌至新栅格)
  7. iptable 详解_最全的iptables防火墙详解.pdf
  8. 戏(细)说Executor框架线程池任务执行全过程(上)
  9. 查看oracle 用户执行的sql语句历史记录
  10. 【Erlang开源项目】HTTP客户端ibrowse
  11. vue分享卡住_【面经分享】华为测试工程师面经
  12. python结巴分词下载_jieba: 结巴中文分词做最好的Python分词组件
  13. 如何优化Flash动画使文件更小播放更流畅
  14. Windows任务栏搜索功能修复
  15. 开发独立证券交易系统的一些体会,有下单撮合系统,自己产生交易行情,可实现分布式部署
  16. Tri-Training: Exploiting Unlabeled Data Using Three Classifiers
  17. 基因结构显示服务器,科学网—宏基因组注释和可视化神器MEGAN入门 - 刘永鑫的博文...
  18. 将Raspberry Pi用作台式PC的17个最佳Raspbian应用
  19. kol营销推广 | 达人营销,如何精准且快速找达人?
  20. 145页6万字政务大数据交换共享平台建设方案

热门文章

  1. Python数据可视化(三)绘制统计图形大全
  2. 知乎图片选择器 Matisse 图片出错问题分析
  3. iOS定位服务 CoreLocation
  4. R语言:如何批量导入搜狗词库
  5. java计算机毕业设计游戏账号交易源程序+mysql+系统+lw文档+远程调试
  6. Centos6.5系统时间慢8小时解决方案
  7. Moravec,Forstner和Harris特征点提取opencv实现
  8. 线性代数之 投影矩阵
  9. 二维码怎么转换成链接地址?二维码生成网址的操作方法
  10. 王小川新公司开源 70 亿参数量的中英文预训练大模型,可商用;谷歌要求员工慎用 AI,即便是自己家的 Bard|极客头条...