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 ...
随机推荐
- Quantitative Trading with R(一):两个简单的策略
下面是两个使用R中的Quantstrat包进行策略构建的例子,都是对600550.ss.600192.ss.600152.ss.600644.ss.600885.ss.600151.ss六只股票进行投 ...
- flask使用blinker信号机制解耦业务代码解决ImportError: cannot import name 'app',以异步发送邮件为例
百度了大半天,不知道怎么搞,直到学习了blinker才想到解决办法,因为之前写java都是文件分开的, 所以发送邮件业务代码也放到view里面,但是异步线程需要使用app,蛋疼的是其他模块不能从app ...
- Python 入门基本知识
编码:是把机器语言翻译成人能看懂的语言 美国信息互换标准代码<<ASSIC>>这张表就是相当于语法表随着发展后面又出现了:gb2312 ——到—— gbk18030 AS ...
- ActiveMQ 快速入门教程系列 第一章 点对点消息实现
ActiveMQ 开发包下载及运行环境搭建 主页:http://activemq.apache.org/目前最新版本:5.11.1开发包及源码下载地址:http://activemq.apache.o ...
- Web 开发工具类(2): HttpClientUtils
HttpClientUtils 整合了一些 web开发中常用的httpClient操作: package com.evan.common.utils; import java.io.IOExcepti ...
- 踩坑:windows系统下,nodejs版本管理器无法使用n来管理
错误 :在windows系统下,需要npm 一个n来管理nodejs的版本,但是使用npm install -g n命令之后报错 原因 : n 不支持 windows系统 只支持mac系统.
- python笔记16
1.今日内容 模块基础知识 time/datetime json/picle shutil logging 其他 2.内容回顾和补充 2.1模块(类库) 内置 第三方 自定义 面试题: 列举常用内置模 ...
- (二)MyBatis延迟加载,一级缓存,二级缓存
延迟加载配置: 什么时候用延迟加载?比如现在有班级和学生表,一对多关系,你可能只需要班级的信息,而不需要该班级学生的信息,这时候可以进行配置,让查询时先查询到班级的信息,在之后需要学生信息时候,再进行 ...
- It is possible and safe to monitor a table DML history on sqlserver
He is my test step: In a test enviroument, I make a table "test"/ demo table:create table ...
- 题解【Luogu6022 快乐水】
\[ Preface \] 大概在半年前出过这道((( 然后当天读完这题,把自己写的 std 改了一下 ll 和特判信息交上去就 A 了. 捡了个大便宜. \[ Description \] 你一开始 ...