高阶函数HOF和高阶组件HOC(Higher Order Func/Comp)

一、什么是高阶函数(组件),作用是什么?

子类使用父类的方法可以通过继承的方式实现,那无关联组件通信(redux)、父类使用子类方法(反向继承)呢
为了解决类(函数)功能交叉/功能复用等问题,通过传入类/函数返回类/函数(继承)的方式使得类拥有自身未定义的方法。

例如react-redux的connect方法使用了高阶组件:

React Redux的connect:

const HOC = connnect(mapStateToProps)(Comp);
// connect为柯里化函数  实际为 =>
function connect(mapStateToProps) {
  // ...
  return function(Comp) {
    // ...
  }
}
// 使用箭头函数则为
const connect = mapStateToProps => Comp => {...};

二、通过高阶函数实现两个无关函数的通信

需求介绍

存在一个类SubClass(子类),该类范围内有数据state对象,且有setState和getState两个函数方法。现在希望通过SupClass1(超/父类1)去调用SubClass(子类)的setState方法,并在SupClass2(超/父类2)里通过getState方法输出结果。

注意,子为sub,父为sup

文件目录
├  ├── SubClass.js              # 子类
├  ├── SupClass1.js             # 父类1
├  ├── SupClass2.js             # 父类2
├── index.html

SubClass类增加数据state,并赋予查询修改的能力

// SubClass.js
class SubClass {
  constructor(args = {}) {
    this.state = {
      ...args,
    };
  }
  // 赋值时需要提供键和值
  setState = (key, val) => {
    this.state = {
      [key]: val,
    };
  };
  getState = (key) => {
    if (key in this.state) {
      return this.state[key];
    }
    // 当然我们希望严谨点
    const err = '无效key值';
    throw err;
  };
}

我们试试SubClass功能如何

// index.html
const subcls = new SubClass({name: 'xiaobe'});
const res = subCls.getState('name');
console.log('res', res);
// 输出xiaobe,妥妥的

接下来我们给SupClass1赋予setState的能力

class SuperClass1 {
  set(key, val) {
    // SuperClass1里没有setState方法!
    this.setState(key, val);
  }
}

如果直接执行类里的get方法肯定是会出错的。所以我们需要先对SupClass1做点事情。

需要给SuperClass1类里增加方法setState,可以使用继承

// SuperClass1.js
class SuperClass1 extends SubClass {
  constructor(props) {
    super(props);
  }
  set(key, val) {
    // 父类1上使用子类的setState方法
    this.setState(key, val);
  }
}

// index.html
const supCls1 = new SuperClass1({name: 'sup-xiaobe'});
const res = supCls1.getState('name');
console.log(res);
// 也能输出sup-xiaobe

但如果单纯使用继承的方式会造成很多的麻烦,试想下如果两个非父子关系的组件使用了继承,会导致自身的方法被覆盖掉!

因此我们还是需要通过高阶组件实现;

首先我们先给子类SubClass增加一个HOC入口

class SubClass {
  // ...
  HOC(cls) {
    // 需要调用SubClass类的方法,所以需要存一份其this
    const sub_this = this;
    // 父类除了以下新增的两个方法,其他无任何变化地返回!
    return class extends cls {
      constructor(props) {
        super(props);
        // 此处this指向该子类,sub_this指向SubClass类
        this.getState = sub_this.getState;
        this.setState = sub_this.setState;
      }
    }
  }
  // ...
}

接着我们来父类1SupClass1实例化前升级(调用HOC)!

// index.html
const subCls = new SubClass();
// 在子类实例化后给父类加上HOC方法
const supClsHoc1 = subCls.HOC(SuperClass1);
// 实例化父类
const supCls1 = new supClsHoc1();
// 重新定义state.name
supCls1.set('name', 'sup-xiaobe');

console.log(supCls.getState('name'));
// 输出sup-xiaobe

同理地完成SupClass2

// SupClass2.js
class SuperClass2 {
  get(key) {
    return this.getState(key);
  }
}

// 最终的index.html
const subCls = new SubClass({name: 'xiaobe'});
const supClsHoc1 = subCls.HOC(SuperClass1);
const supClsHoc2 = subCls.HOC(SuperClass2);
const supCls1 = new supClsHoc1();
const supCls2 = new supClsHoc2(); 

supCls1.set('name', 'sup-xiaobe');
const res = supCls2.get('name');
console.log('res', res);

这么一个基础简单的组件通信就完成了。

根据这个思路可以封装一个类似全局变量的Store.js

--- 后面介绍

React HOC

原文地址:https://www.cnblogs.com/soyxiaobi/p/12151000.html

时间: 2024-09-29 19:27:07

高阶函数HOF和高阶组件HOC(Higher Order Func/Comp)的相关文章

Kotlin的高阶函数和常用高阶函数

Kotlin的高阶函数和常用高阶函数 文章来源:企鹅号 - Android先生 高阶函数的定义 将函数当做参数或者是返回值的函数 什么是高阶函数 可以看看我们常用的 函数: 首先我们可以知道, 是 的扩展函数,然后参数是 ,但是 不再像和我们以前Java那样传递的是一个对象,这时传递的是一个函数.这个函数的入参为 ,返回值为 .所以 也是一个高阶函数,因为它将函数当做参数进行传递了.我们尝试着去调用一下 函数: 调用的时候,我们将 函数传递给了 函数,这里采用的是函数引用.就上诉代码,我们还可以

Python 学习笔记 -- 内嵌函数、闭包、匿名函数、高阶函数map、高阶函数filter、高阶函数reduce

1 #------------------------------内嵌函数------------------------------ 2 #内嵌函数就是在函数内部定义函数 3 #实例一 4 print("#------------------------------内嵌函数------------------------------") 5 def funOutOne(): 6 x = 5 7 def funIn(): 8 x = 3 9 print("My funOutO

高阶组件&&高阶函数(一)

antd里面的form表单方面,遇到一个高阶函数,以及高阶组件,于是看了一下这方面内容,前辈们的文章写得也非常详细,这里就稍微kobe一下 高阶函数与高阶组件 高阶函数: 高阶函数,是一种特别的函数,接受的参数为函数,返回值也是函数 成立条件,二者兼一即可 1).一类特别的函数 a).接受函数类型的参数 b).函数返回值是函数 常见的高阶函数: 2).常见 a).定时器:setTimeout()/setInterval() b).Promise:Promise(()=>{}) then(valu

[Scheme入门]3 高阶函数

 1.高阶函数的介绍 高阶函数的英文名称是Higher Order Function,它们是以函数为参数的函数.主要用于映射(mapping).过滤(filtering).归档(folding)和排序(sorting)表.高阶函数让程序更具模块性,让函数更加通用. 函数sort具有2个参数,一个是需要排序的表,另一个是定序(Ordering)函数.下面展示了按照大小将一个整数表正序排序.而<函数就是本例中函数的定序函数. (sort'(420 -130 138 983 0 298 783 -

2016.3.3(Spark框架预览,Scala部分应用函数、闭包、高阶函数,关于语义分析的一些心得)

一.Spark框架预览 主要有Core.GraphX.MLlib.Spark Streaming.Spark SQL等几部分. GraphX是进行图计算与图挖掘,其中主流的图计算框架现在有:Pregal.HAMA.Giraph(这几部分采用超步即同步的方式),而GraphLab与Spark GraphX采用异步的方式进行.它与Spark SQL进行协作时,一般是用SQL语句来进行ETL(Extract-Transform-Load数据仓库技术)然后交给GraphX处理. Spark SQL的前身

高阶函数-范例

def foo(): print('我的函数名作作为参数传给高阶函数')def gao_jie1(func): print('我就是高阶函数1,我接受的参数名是%s'%func) func() def gao_jie2(func): print('我就是高阶函数2,我的返回值是%s'%func) return funcgao_jie1(foo)gao_jie2(foo)

【Scheme归纳】4 高阶函数

1.高阶函数的介绍 高阶函数的英文名称是Higher Order Function,它们是以函数为参数的函数.主要用于映射(mapping).过滤(filtering).归档(folding)和排序(sorting)表.高阶函数让程序更具模块性,让函数更加通用. 函数sort具有2个参数,一个是需要排序的表,另一个是定序(Ordering)函数.下面展示了按照大小将一个整数表正序排序.而<函数就是本例中函数的定序函数. (sort‘(420 -130 138 983 0 298 783 -783

python 函数式编程:高阶函数,map/reduce

1 #函数式编程 2 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 3 #(一)高阶函数 4 5 f=abs 6 f 7 print(f(-20)) 8 #结果 20 9 #函数可以赋值给一个变量,即:变量可以指向函数 10 #那么函数名是什么?函数名其实就是指向函数的变量! 11 12 #下面的代码,执行后,abs已经不指向求绝对值函数而是一个整数10了. 13 #后面的abs(-10)将报错,无法执行,必须重启python才可以. 14 #abs=10

JS基础:高阶函数

函数声明和函数表达式 在 JS 中定义函数的方式有两种:一种是函数声明,一种是函数表达式. 例如: //函数声明 function fun() { ... } //函数表达式 var f = function() { ... } 它们的区别在于 JS 会把函数声明提升到作用域顶部,而函数表达式只有在执行到该语句时才会生效 关于函数的其他注意事项: 1.函数名后面跟圆括号 "()" 表示立即执行该函数,例如: var test = fun(); //表示执行 "fun"