子类使用父类的方法能够经过继承的方式实现,那无关联组件通讯(redux)、父类使用子类方法(反向继承)呢
为了解决类(函数)功能交叉/功能复用等问题,经过传入类/函数返回类/函数(继承)的方式使得类拥有自身未定义的方法。html
例如react-redux
的connect方法使用了高阶组件:react
React Redux
的connect:redux
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,并赋予查询和修改的能力this
// 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
功能如何code
// index.html const subcls = new SubClass({name: 'xiaobe'}); const res = subCls.getState('name'); console.log('res', res); // 输出xiaobe,妥妥的
接下来咱们给SupClass1
赋予setState
的能力htm
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
--- 后面介绍