React HOC(高阶组件)
先看这篇理解高阶组件 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(高阶组件)的更多相关文章
- 【转】react的高阶组件
React进阶之高阶组件 前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只 ...
- React 之 高阶组件的理解
1.基本概念 高阶组件是参数为组件,返回值为新组件的函数. 2.举例说明 ① 装饰工厂模式 组件是 react 中的基本单元,组件中通常有一些逻辑(非渲染)需要复用处理.这里我们可以用高阶组件对组件内 ...
- react.js 高阶组件----很简单的实例理解高阶组件思想
调试代码之前,我设置了两个缓存 分别是username和content 在控制台console设置两个缓存代码 localStorage.setItem('username','老王')localSt ...
- react之高阶组件(二)
高阶组件的使用 接上文———— 一.像函数一样直接调用 import React, { Component } from 'react' import A from './A' class C ext ...
- react用高阶组件实现路由守卫
react-router不像vue-router一样有很多钩子函数,可以做路由守卫.想实现路由守卫,可以用高阶组件来实现. @connect(state => ({ isLogin: state ...
- react之高阶组件(一)
当两个或多个组件有相同的地方,可以将相同的部分抽离出来 先创建三个组件A.B.C A.js import React, { Component } from 'react' class A exten ...
- React高阶组件总结
在多个不同的组件中需要用到相同的功能,这个解决方法,通常有Mixin和高阶组件. Mixin方法例如: //给所有组件添加一个name属性 var defaultMixin = { getDefaul ...
- React高阶组件 和 Render Props
高阶组件 本质 本质是函数,将组件作为接收参数,返回一个新的组件.HOC本身不是React API,是一种基于React组合的特而形成的设计模式. 解决的问题(作用) 一句话概括:功能的复用,减少代码 ...
- React中的高阶组件,无状态组件,PureComponent
1. 高阶组件 React中的高阶组件是一个函数,不是一个组件. 函数的入参有一个React组件和一些参数,返回值是一个包装后的React组件.相当于将输入的React组件进行了一些增强.React的 ...
- React-理解高阶组件
高阶组件:定义一个函数,传入一个组件,返回另外一个组件,另外一个组件包裹了传入的组件. 分类:属性代理高阶组件,反向继承高阶组件. 作用:代码复用,渲染节时. 高阶函数例子: function hel ...
随机推荐
- 面试系列-面试官:你能给我解释一下javascript中的this吗?
一.前言 关于javascript中的this对象,可能已经被大家说烂了. 即使是这样,我依然决定将这篇文章给水出来.毕竟全国在新型肺炎的影响下,公司没法正常复工. 除了刷刷手机,还是要适当的学习一下 ...
- Windows 系统安装 Python 3.8 详解
安装 Python 很简单,但是其中的很多细节未必大家都清楚,趁着给自己安装最新 3.8 版本,把整个过程详细记录下. Python or Anaconda 本节是专门写给一些小白,Python 还没 ...
- ffplay的使用
https://www.cnblogs.com/renhui/p/8458802.html
- Spring注解开发系列VIII --- SpringMVC
SpringMVC是三层架构中的控制层部分,有过JavaWEB开发经验的同学一定很熟悉它的使用了.这边有我之前整理的SpringMVC相关的链接: 1.SpringMVC入门 2.SpringMVC进 ...
- python中map()和dict()的用法
map()用法 map()是python的内置函数,会根据提供的函数对指定序列做映射. 语法: map(func, iter, ...) 其中func为一个功能函数,iter表示可迭代参数序列.map ...
- nginx的进程结构实例演示
nginx父子进程之间是使用信号进行管理的. nginx -s reload 会使之前的nginx子进程退出,生成新的nginx子进程 或者kill -SIGHUP 9170 kill -SIGTER ...
- Go语言之路—博客目录
Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...
- linux下手动安装/升级GCC到较高版本
一.环境 VMWare+Centos7 二.写在前面的话 安装GCC最简单的方式当然是[yum -y install gcc]但是我的机器上安装下来后,其版本是4.8.5,感觉有点低,所以想升级一下( ...
- Python:自动化上传OSS
简介 最近在学习Python,为之庞大的第三方库感到震撼.今天分享一个Python 自动化脚本,功能是将H5静态资源上传到OSS,以方便实现CDN加速,我将其放在Jenkins自动发布中使用.该脚本不 ...
- GDAL利用地理坐标读取图像像元值
最近的一个项目需要在电子海图中下载已知水深点,导出点的地理坐标(经纬度).然后在arcgis中打开这些地理坐标输出为shp,利用GDAL读取不同波段的点对应的像元值,从而构建水深和像元值的对应关系. ...