当前位置: 首页 > 面试题库 >

React ES6组件继承:有效,但不推荐?

顾跃
2023-03-14
问题内容

我目前正在以以下方式继承ES6 React基本组件:

model.js(基本组件):

class ModelComponent extends React.Component {

    render() {
        // Re-used rendering function (in our case, using react-three's ReactTHREE.Mesh)
        ...
    }

}

ModelComponent.propTypes = {
    // Re-used propTypes
    ...
};

export default ModelComponent;

然后,我有两个扩展组件,它们基本上都看起来像这样:

import ModelComponent from './model';

class RobotRetroComponent extends ModelComponent {

    constructor(props) {

        super(props);

        this.displayName = 'Retro Robot';

        // Load model here and set geometry & material
        ...

    }

}

export default RobotRetroComponent;

(完整的源代码在这里)

这似乎工作正常。两种模型都可以正常显示并正常工作。

但是,我在多个地方都知道继承不是React的正确方法-相反,我应该使用组合。但是话又说回来,React v0.13不支持Mixins吗?

那么,我采用的方法还可以吗?如果不是,那是什么问题,我应该怎么做呢?


问题答案:

Facebook团队建议在编写React代码时“使用惯用的JavaScript概念”,并且由于不支持ES6类的混合,因此应该只使用组合(因为您只是在使用惯用的Javascript函数)。

在这种情况下,您可以使用一个composeModal函数,该函数接受一个组件并将其包装在一个高阶容器组件中返回。这个更高阶的组件将包含您想要传递给所有子组件的任何逻辑,状态和道具。

export default function composeModal(Component){

   class Modal extends React.Component {

       constructor(props){
           super(props)
           this.state = {/* inital state */}
       }

       render() {
           // here you can pass down whatever you want 'inherited' by the child
           return <Component {...this.props} {..this.state}/>
       }

   }

   Modal.propTypes = {
      // Re-used propTypes
      ...
   };

   return Modal
}

然后,您可以使用合成功能,如下所示:

import composeModal from './composeModal';

class RobotRetroComponent extends React.Component {

    constructor(props) {
        super(props);
        this.displayName = 'Retro Robot';
        // Load model here and set geometry & material
        ...
    }

    render(){
        return /* Your JSX here */
    }
}

export default composeModal(RobotRetroComponent);


 类似资料:
  • 问题内容: 从我的代码中,我希望我的卧室类继承超类-房间的长度和宽度。我已在评论的相应行中填充了错误。我遇到错误,找不到出路。请帮帮我? 问题答案: 您的BedRoom类具有 伪构造函数, 而不是真正的构造函数。构造函数不返回任何内容,也不返回空值。摆脱该无效声明。 更改 至

  • FAQs in section [24]: [24.1] 如何表示“私有继承”? [24.2] 私有继承和组合(composition)有什么类似? [24.3] 我应该选谁:组合还是私有继承? [24.4] 从私有继承类到父类需要指针类型转换吗? [24.5] 保护继承和私有继承的关系是什么? [24.6] 私有继承和保护继承的访问规则是什么? 24.1 如何表示“私有继承”? 用 : priv

  • 我有一个简单的类,注释为 例如: 然后我有一个扩展这个bean的配置bean: 似乎忽略了有条件的,无论条件如何解决,都会始终处理配置(甚至没有调用) 只要我将有条件注释移动到MyConfig,一切都会正常工作。 从文档: @条件注释可以以下列任何一种方式使用: 作为使用@组件直接或间接注释的任何类的类型级注释,包括@配置类 我假设第一点适用于这里,即MyConfig间接地用配置注释。或者间接引用

  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A

  • 本文向大家介绍JS继承之借用构造函数继承和组合继承,包括了JS继承之借用构造函数继承和组合继承的使用技巧和注意事项,需要的朋友参考一下 借用构造函数继承  在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术(有时候也叫做伪造对象或经典继承)。这种技术的基本思想相当简单,即在子类型构造函数的内部调用超类型构造函数。 

  • 本文向大家介绍浅谈JS继承_寄生式继承 & 寄生组合式继承,包括了浅谈JS继承_寄生式继承 & 寄生组合式继承的使用技巧和注意事项,需要的朋友参考一下 5.寄生式继承 与寄生构造函数和工厂模式类似,创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回对象。 在上述例子中,createAnother函数接收了一个参数,也就是将要作为新对象基础的对象。 anotherPerso