Composition vs inheritance

#1

如果我引用了第三方的组件库,并且想部分修改某个组件的方法,用inheritance可以这么做:

import React from 'react';
import {Table} from 'antd';
class HelloTable extends Table{
    onHelloClick = (e) => {
        // add new methods
    }
    render(){
        // rewrite render method
    }
}
export default HelloTable;

但是我怎么用composition来做到这个呢?

#2

我以为Higher-Order Components能解决这个问题所以我去阅读了官方文档。

我理解的HOC:把不变的部分当成是函数主体写在函数里,把变化的部分当成是参数传入函数,在函数里组合这两个部分。

但是感觉有些inheritance能实现的,HOC还是没法实现。把变化的部分当作参数传进去,这很棒,所以HOC实际上还是一种组合,但是“组合”这个词的隐藏前置步骤是“拆分”,也就是我要用“组合”重写第三方组件的时候,我得先“拆分”第三方组件,把它变化和不变的地方提炼出来,不变的地方变成HOC函数的主体,变化的部分变成HOC函数的参数。

这样拆分第三方组件的时候会不会成本过大?我去读它的源码,把不变的地方ctrl C+V弄过来,变化的地方还要重新组织一下,那我为何不ctrl C+V把这个组件所有的源码都拷过来,然后只改我要改的地方?

还是说之前的理解,我认为“组合”的前提是“拆分”,如果是我自己写的组件,拆分可能比较简单。但我引用第三方组件过来的时候是一个整体,拆分成本会不会过高?

在这种情况下,composition真的能拯救inheritance吗

#3

备好板凳,瓜子

#4

随意修改已经继承的class,违反开闭原则的。而且dan也不推荐二次继承组件。如果加一个装饰器就能增加一项特性,为什么要修改或者继续继承呢:smirk:

#5

不太能理解“如果加一个装饰器就能增加一项特性”,如果能就着我的例子讲解一下就感激不尽了

#6

我知道react官方不推荐继承,我现在的问题是,这样一种场景下,composition要怎么去写代码

#7

就这你这个思路,我写不出来

#8

不推荐直接修改原组件。

function logProps(InputComponent) {
  InputComponent.prototype.componentWillReceiveProps(nextProps) {
    console.log('Current props: ', this.props);
    console.log('Next props: ', nextProps);
  }
  return InputComponent;
}

const EnhancedComponent = logProps(InputComponent);
#9

这个是错误写法吧。

#10

为什么不用继承?你的这个用例是标准的继承写法啊。

#12

看清楚:

#dont-mutate-the-original-component.-use-composition.

https://facebook.github.io/react/docs/higher-order-components.html#dont-mutate-the-original-component.-use-composition.