高阶组件

为了提高组件复用性,在react中就有了HOC(Higher-Order Component)的概念。所谓的高阶组件,其本质依旧是组件,只是它返回另外一个组件,产生新的组件可以对属性进行包装,也可以重写部分生命周期。

首先看一下简单的例子:在components文件夹下新建Hoc.js组件文件,并在index.js中引入该组件。

Hoc.js

import React, { Component } from "react";

function test(props){
return (
<div>{props.stage} - {props.name}</div>
)
} const withName = Comp => {
return props => <Comp {...props} name="高阶组件试用" />
} export default withName(test)

index.js

上面例子中的widthName组件就是一个高阶组件,接收了一个组件,为该组件传递一个name参数后,返回扩展以后的组件,这就是高阶组件的用法。

重写生命周期

当我们需要在高阶组件的某个生命周期里面获取数据或者做其他的操作的时候,可以使用高阶组件重写生命周期。

Hoc.js

import React, { Component } from "react";

function test(props){
return (
<div>{props.stage} - {props.name}</div>
)
} const withName = Comp => {
class NewComponent extends Component{
componentDidMount(){
console.log('高阶组件重写生命周期');
}
render(){
return <Comp {...this.props} name="高阶组件试用" />
}
}
return NewComponent
} export default withName(test)

高阶组件链式调用

import React, { Component } from "react";

function test(props){
return (
<div>{props.stage} - {props.name}</div>
)
} const withName = Comp => {
class NewComponent extends Component{
componentDidMount(){
console.log('高阶组件重写生命周期');
}
render(){
return <Comp {...this.props} name="高阶组件试用" />
}
}
return NewComponent
} const widthLog = Comp => {
console.log(Comp.name + '渲染了');
return props => <Comp {...props} />
} export default widthLog(withName(test))

高阶组件装饰器写法

在上面的高阶组件链式调用的时候,我们使用的嵌套的写法,这种写法很不直观,因此可以借助ES7里面的装饰器来处理这种问题。

首先,需要在项目根目录执行安装命令:

npm install --save-dev babel-plugin-transform-decorators-legacy

其次,修改config-overrides.js

然后,重启项目后改造上面的高阶组件:

1,将连个高阶组件移动到需要改造的test组件上面;

2,在需要改造的test组件前面依次调用两个高阶组件;

3,将需要改造的test组件由函数组件改为class类组件;

import React, { Component } from "react";

const withName = Comp => {
class NewComponent extends Component{
componentDidMount(){
console.log('高阶组件重写生命周期');
}
render(){
return <Comp {...this.props} name="高阶组件试用" />
}
}
return NewComponent
} const withLog = Comp => {
console.log(Comp.name + '渲染了');
return props => <Comp {...props} />
}; @withName
@withLog class test extends Component{
render(){
return (
<div>{this.props.stage} - {this.props.name}</div>
)
}
}
export default test

react高阶组件的更多相关文章

  1. 聊聊React高阶组件(Higher-Order Components)

    使用 react已经有不短的时间了,最近看到关于 react高阶组件的一篇文章,看了之后顿时眼前一亮,对于我这种还在新手村晃荡.一切朝着打怪升级看齐的小喽啰来说,像这种难度不是太高同时门槛也不是那么低 ...

  2. 当初要是看了这篇,React高阶组件早会了

    当初要是看了这篇,React高阶组件早会了. 概况: 什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说 ...

  3. react高阶组件的理解

    [高阶组件和函数式编程] function hello() { console.log('hello jason'); } function WrapperHello(fn) { return fun ...

  4. 函数式编程与React高阶组件

    相信不少看过一些框架或者是类库的人都有印象,一个函数叫什么creator或者是什么什么createToFuntion,总是接收一个函数,来返回另一个函数.这是一个高阶函数,它可以接收函数可以当参数,也 ...

  5. React高阶组件学习笔记

    高阶函数的基本概念: 函数可以作为参数被传递,函数可以作为函数值输出. 高阶组件基本概念: 高阶组件就说接受一个组件作为参数,并返回一个新组件的函数. 为什么需要高阶组件 多个组件都需要某个相同的功能 ...

  6. 利用 React 高阶组件实现一个面包屑导航

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

  7. react高阶组件的一些运用

    今天学习了react高阶组件,刚接触react学习起来还是比较困难,和大家分享一下今天学习的知识吧,另外缺少的地方欢迎补充哈哈 高阶组件(Higher Order Components,简称:HOC) ...

  8. React——高阶组件

    1.在React中higher-order component (HOC)是一种重用组件逻辑的高级技术.HOC不是React API中的一部分.HOC是一个函数,该函数接收一个组件并且返回一个新组件. ...

  9. react 高阶组件的 理解和应用

    高阶组件是什么东西 简单的理解是:一个包装了另一个基础组件的组件.(相对高阶组件来说,我习惯把被包装的组件称为基础组件) 注意:这里说的是包装,可以理解成包裹和组装: 具体的是高阶组件的两种形式吧: ...

  10. react高阶组件的使用

    为了提高代码的复用在react中我们可以使用高阶组件 1.添加高阶组件 高阶组件主要代码模板HOC.js export default (WrappedComponent) => { retur ...

随机推荐

  1. H5离线缓存技术

      HTML5提供了很多新的功能以及相应的接口,离线存储就是其中的一个,离线存储可以将站点的一些文件存储在本地,在没有网络的时候还是可以访问到以缓存的对应的站点页面,其中这些文件可以包括html,js ...

  2. Mad Libs游戏 & 华氏温度与摄氏温度转换

    Mad Libs游戏 animal1 = input("请输入一种动物") animal2 = input("请输入一种动物") movement1 = inp ...

  3. java数学函数Math类中常用的方法

    Math类提供了常用的一些数学函数,如:三角函数.对数.指数等.一个数学公式如果想用代码表示,则可以将其拆分然后套用Math类下的方法即可. Math.abs(12.3);               ...

  4. CSS学习笔记-05 过渡模块的基本用法

    话说 1对情侣两情相悦,你情我愿.时机成熟,夜深人静...咳 ,如果就这么直奔主题,是不是有点猴急,所以,还是要来点前戏@. 铛 铛, 这个时候 过渡模块出现了. 划重点: 上代码: <!DOC ...

  5. 在HTML中用循环语句

    <%for(){%  > <tr> <td></td> <td></td> </tr> <%}%> 注意 ...

  6. Problem A: 平面上的点和线——Point类、Line类 (I)

    Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...

  7. Eclipse安装Activiti Designer插件

    本人使用的是在线安装: 打开Eclipse -> Help -> Install New SoftWare-> Add 然后按照如下对话框输入: Name:Activiti BPMN ...

  8. 自动化测试-2.seleniumIDE

    一.安装步骤 1. 打开Firefox浏览器 2. 打开https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/versions/,点击 ...

  9. Mysql 复制一个新表

    1.复制表结构及数据到新表CREATE TABLE 新表 SELECT * FROM 旧表这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable;来 ...

  10. 【EMV L2】DDA标准动态数据认证处理流程

    [标准动态数据认证DDA] 标准动态数据处理过程,除了动态签名由卡片生成以外,其他都是由终端执行的.处理过程: 1.认证中心公钥的获取终端使用认证中心公钥索引(PKI)以及卡片中的注册的应用提供商标识 ...