先看这篇理解高阶组件   https://github.com/brickspert/blog/issues/2

一、定义

  高阶函数:函数接受函数作为输入,或者输出一个函数。

  高阶组件:接受React组件作为输入,或是输出一个组件。即hocFactory:: W: React.Component => E: React.Component

  高阶组件让代码更有复用性、逻辑性、抽象性。

二、实现高阶函数的三种方法。

  1. 属性继承(将Input组件的name,onChange方法提取到高阶组件中)

const Mycontainer = (WrappedComponent) => {
class extends React.Component {
constructor(props) {
     super(props);
      this.state = {
       name: '',
     }
     this.onNameChange = this.onNameChange.bind(this);
    }
    onNameChange(event) {
     this.state({
      name: event.target.value,
     })
    }
render() {
     const newProps = { name:{
      value: this.state.name,
      onChange: this.onNameChange,
     } };
return <WrappedComponent {...this.props} {...newProps}/>;
}
}
}
class MyComponent extends React.Component {
// ...
} export default Mycontainer(MyComponent);

  2. 反向继承

  渲染劫持: 就是高阶组件可以控制组件渲染以及props,state等。

const MyContainer = WrappedComponent =>
class extends WrappedComponent {
render() {
if (this.props.loggedIn) {
return super.render();
} else {
return null;
}
}
}

3. 组件参数

调用高阶组件时需要传递一些参数

function HOCFactoryFactory(...params) {
// 可以做一些改变params的事情
return function HOCFactory(WrappedComponent) {
return class HOC extends Component {
render() {
return <WrappedComponent {...this.props} {...params}/>
}
}
}
} HOCFactoryFactory(params)(WrappedComponent);

三、使用高阶组件使组件分离,抽象逻辑。

class SelectInput extends React.Component {
static displayName = 'SelectInput'; render() {
const { selectedItem, isActive, onClickHeader, placeholder } = this.props;
const { text } = selectedItem; return (
<div>
<div onClick={onClickHeader}>
<input type="text" disabled value={text} placeholder={placeholder}/>
<Icon className={isActive} name="angle-name"/>
</div>
</div>
);
}
} const searchDecorator = WrappedComponent => {
class SearchDecorator extends React.Component {
constructor(props){
super(props); this.handleSearch = this.handleSearch.bind(this);
} handleSearch(keyword) {
this.setState({
data: this.props.data,
keyword,
});
this.props.onSearch(keyword);
} render() {
const { data, keyword } = this.state;
return (
<WrappedComponent
{...this.props}
data={data}
keyword={keyword}
onSearch={this.handleSearch}
/>
)
}
}
return SearchDecorator;
} const asyncSelectDecorator = WrappedComponent => {
class AsyncSelectDecorator extends React.Component {
componentDidMount() {
const { url, params } = this.props; fetch(url, { params }).then(data => {
this.setState({
data,
});
});
}
render() {
return (
<WrappedComponent
{...this.props}
data={this.state.data}
/>
)
}
}
return AsyncSelectDecorator;
} class App extends React.Component {
render() {
  const Input = searchDecorator(asyncSelectDecorator(SelectInput))
return {
    <Input {...this.props} />
  } 
 }
}

React HOC(高阶组件)的更多相关文章

  1. 【转】react的高阶组件

    React进阶之高阶组件   前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只 ...

  2. React 之 高阶组件的理解

    1.基本概念 高阶组件是参数为组件,返回值为新组件的函数. 2.举例说明 ① 装饰工厂模式 组件是 react 中的基本单元,组件中通常有一些逻辑(非渲染)需要复用处理.这里我们可以用高阶组件对组件内 ...

  3. react.js 高阶组件----很简单的实例理解高阶组件思想

    调试代码之前,我设置了两个缓存 分别是username和content 在控制台console设置两个缓存代码 localStorage.setItem('username','老王')localSt ...

  4. react之高阶组件(二)

    高阶组件的使用 接上文———— 一.像函数一样直接调用 import React, { Component } from 'react' import A from './A' class C ext ...

  5. react用高阶组件实现路由守卫

    react-router不像vue-router一样有很多钩子函数,可以做路由守卫.想实现路由守卫,可以用高阶组件来实现. @connect(state => ({ isLogin: state ...

  6. react之高阶组件(一)

    当两个或多个组件有相同的地方,可以将相同的部分抽离出来 先创建三个组件A.B.C A.js import React, { Component } from 'react' class A exten ...

  7. React高阶组件总结

    在多个不同的组件中需要用到相同的功能,这个解决方法,通常有Mixin和高阶组件. Mixin方法例如: //给所有组件添加一个name属性 var defaultMixin = { getDefaul ...

  8. React高阶组件 和 Render Props

    高阶组件 本质 本质是函数,将组件作为接收参数,返回一个新的组件.HOC本身不是React API,是一种基于React组合的特而形成的设计模式. 解决的问题(作用) 一句话概括:功能的复用,减少代码 ...

  9. React中的高阶组件,无状态组件,PureComponent

    1. 高阶组件 React中的高阶组件是一个函数,不是一个组件. 函数的入参有一个React组件和一些参数,返回值是一个包装后的React组件.相当于将输入的React组件进行了一些增强.React的 ...

  10. React-理解高阶组件

    高阶组件:定义一个函数,传入一个组件,返回另外一个组件,另外一个组件包裹了传入的组件. 分类:属性代理高阶组件,反向继承高阶组件. 作用:代码复用,渲染节时. 高阶函数例子: function hel ...

随机推荐

  1. springboot开发之配置自定义的错误界面和错误信息

    如何定制错误页面? (1)在有模板引擎的情况下:在template文件夹下的error/状态码:即将错误页面命名为:错误状态码.html放在template文件夹里面的error文件夹下,发生此状态码 ...

  2. Jconsole或者VisualVM监控远程主机(阿里云,jdk11或者8)

    准备: 1 一个war包或者jar包,这里我用springboot的 2 linux环境,安装tomcat,jdk,我用的jdk11和tomcat9,jdk11和8的拷贝权限文件路径有点不一样,这个需 ...

  3. RSYNC 同步工具

    Rsync 数据同步工具 一.Rsync简介 1.检测一下你的机器上是否已经安装  --->可以通过yum安装  或者  源码 Server  192.168.201.151 Client    ...

  4. CSS快速入门例子

    CSS入门应用 01-结合方式01 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  5. Spring相关jar说明

    Spring整合使用说明 一.只是使用spring框架 dist\spring.jar lib\jakarta-commons\commons-logging.jar 如果使用到了切面编程(AOP), ...

  6. Linux磁盘管理及挂载

    1.在vm workstations添加磁盘 添加完之后重启一下虚拟机 然后fdisk -l 可以看到虚拟机已经识别到了新的磁盘 2.添加磁盘分区 输入命令 fdisk /dev/sdb 命令(输入 ...

  7. Java入门基础(类)

    类 在Java中表示自定义的数据类型,一个class可以是若干基本类型的组合. public class Student { public String id;//学号 public String n ...

  8. 《Python学习手册 第五版》 -第7章 字符串基础

    本章内容是关于字符串的,字符串是编程中经常遇到的问题,本章的内容不是包含所有字符串的讲解,而是针对其最基本的内容进行说明,后续的相关章节会根据需要进行扩展和说明,例如后续的第37章内容会讲解Unico ...

  9. 基于 Serverless Component 全栈解决方案

    什么是 Serverless Component Serverless Component 是 Serverless Framework 的,支持多个云资源编排和组织的场景化解决方案. Serverl ...

  10. DOM - Document Object Model

    Document Object Model