【问题标题】:What is the difference between Higher Order Component (HOC) and Inheritance in React native componentReact原生组件中的高阶组件(HOC)和继承有什么区别
【发布时间】:2019-04-12 18:08:27
【问题描述】:

我是 .net 背景下的原生反应,

这里的问题是 HOC 与 OOPS 概念中的继承有何不同,它有一个具有基本属性的父类和一个扩展 Base 并使用 Base 类中的状态、属性和基本方法的子类。

在React Components中实现Parent->Child->GrandChild层次关系的最佳方式是什么?

例如:

Parent.js看起来像

class Parent extends Component
{
    constructor(props)
    {
        super(props);
        this.state = {
            value: "Parent",
            BaseText: "Inheritance Example"
        }
    }

    onUpdate = () => {
        console.log("Update called at Parent")
    }
}

Child.js 扩展了 Parent.js

class Child extends Parent
{
    constructor(props)
    {
        super(props);
       //this state should inherit the properties of Parent and override only the value property
        this.state = {
            value: "Child",
        }
    }

    onUpdate = () => {
        super.onUpdate();
        console.log("Update called at Child view")
    }



    render()
    {
        return(
            <View>
                <Text> Child View</Text>
            </View>
        )
    }
}

GrandChild.js 扩展自 Child.js

class GrandChild extends Child
    {
        constructor(props)
        {
            super(props);
           //this state should inherit the properties of Child, Parent and properties specific to this
            this.state = {
                value: "GrandChild",
                Name: "Test Grand Child"
            }
        }

        onUpdate = () => {
            super.onUpdate();
            console.log("Update called at Grand Child view")
        }



        render()
        {
            return(
                <View>
                    <Text> Grand Child View</Text>
                </View>
            )
        }
    }

这是在 react native 中实现 抽象 的正确方法吗 说父类将具有公共状态属性,子类继承父状态并具有自己的属性。

在这种情况下如何继承状态以及如何将值更新为状态。?

【问题讨论】:

  • HOC 使用组合,reactjs.org/docs/composition-vs-inheritance.html。这一点类似于 OOP 的 en.wikipedia.org/wiki/Composition_over_inheritance这是实现 Parent-> Child -> GrandChild 层次关系的最佳方式 - 没有“最佳方式”,因为这取决于组件。如果您有特定的案例,请考虑使用特定的代码示例重新提出问题。
  • 肯定会用示例代码sn-p修改问题。
  • 你有更真实的例子吗? this.state 子组件中的继承不适用于组件组合,但我想不出这样做的好理由。如果状态变得如此复杂,则可能需要使用状态管理(Redux?)。组件需要重构以更好地适应组合,但我不能建议如何做到这一点,因为不清楚组件的真正作用。顺便说一句,onUpdate 不适合继承,因为它是实例方法,不会有super.onUpdate,它应该是原型方法。
  • JavaScript 中的继承是原型。 HOC 是组合函数。

标签: reactjs react-native ecmascript-6 es6-class


【解决方案1】:

React 提倡 composition 作为类继承的替代方案。组件被设计为高效组合。 Hooks API 为函数组件增加了以前需要使用类组件的功能。

这并不意味着不允许继承。问题在于现有的模式如高阶组件在 React 生态系统中被广泛使用,并且与 OOP 不兼容:

const withBaz = Comp => <Comp baz />

@withBaz
class Bar extends Foo { ... }

这种方法很常见,但对 OOP 不友好,因为在这种情况下,Bar 实际上不再是类而是箭头函数,它不能被进一步继承。

只要开发人员控制类层次结构中的所有组件,对第一方 React 组件使用 OOP 就没有问题,但这可能不切实际,因为可能总是需要涉及第三方代码OOP 友好。在适合的地方使用组合可以带来更灵活的设计。

【讨论】:

  • 与组合是否有可能有生命周期事件。?说Parent类有一个ComponentDidMount(),渲染Child应该调用它自己的Componentdidmount以及Parent的生命周期事件。?
  • componentDidMount 如果它们被挂载(即成功渲染),将在两个组件中调用。
  • 最后一个问题。如何在 Child 中实现 state 属性的继承以同时使用 Parent 和它自己的 state 属性。?
  • 你可能不需要。这就是为什么我要求提供真实世界的例子。它可以用一种对 React 来说没有继承的惯用方式来表达。通常只有在需要扩展无法直接修改的第三方类组件的功能时才需要使用继承。
  • 例如,我们正在构建一个 DataEntry 表单(包括输入控件、网格等)和列表表单(包括搜索控件和一个网格),其中有一些常见的方法,例如将网格导出到 Excel ,获取该网格的记录,状态属性,例如 FormName、GridName。所以我希望这些常用方法和状态属性成为 AbstractForm.js 的一部分,这将充当 DataentryForm.js(有关输入字段的详细信息特定于该子项)和 ListForm.js(有关搜索字段的详细信息)的父级特定于这个孩子)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2018-09-14
相关资源
最近更新 更多