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

扩展React.js组件

施彦
2023-03-14
问题内容

我最欣赏Backbone.js的一件事是简单而优雅的继承是如何工作的。我开始着手处理React,并且在React中无法真正找到类似于此Backbone代码的任何内容

var Vehicle = Backbone.View.extend({
    methodA: function() { // ... }
    methodB: function() { // ... }
    methodC: function() { // ... }
});

var Airplane = Vehicle.extend({
    methodC: function() {
        // Overwrite methodC from super
    }
});

在react中,我们有mixin,如果使用mixin,我们可以像上面的例子那样有点接近

var vehicleMethods = {
    methodA: function() { // ... }
    methodB: function() { // ... }
}

var Vehicle = React.createClass({
    mixins: [vehicleMethods]
    methodC: function() { 
        // Define method C for vehicle
    }
});

var Airplane = React.createClass({
    mixins: [vehicleMethods]
    methodC: function() {
        // Define method C again for airplane
    }
});

与一遍又一遍地定义相同的东西相比,这没有那么重复,但是它似乎不像Backbone那样灵活。例如,如果我尝试重新定义/覆盖存在于我的一个混合中的方法,则会收到错误消息。最重要的是,React.js方法为我编写了更多代码。

React中有一些非常聪明的东西,感觉更多的是我没有正确地做到这一点,而不是像React缺少的功能那样。

任何指针,不胜感激。


问题答案:

要获得类似于继承的内容(实际上是注释中指出的 组成
),可以Airplane在示例中将本身包装为Vehicle。如果要VehicleAirplane组件中公开方法,则可以使用ref并将它们一对一连接。这并不完全是继承(实际上是 composition
),尤其是因为this.refs.vehicle在组件安装之后才能访问。

var Vehicle = React.createClass({
    ...
});

var Airplane = React.createClass({
    methodA: function() {
      if (this.refs != null) return this.refs.vehicle.methodA();
    },
    ...
    render: function() {
        return (
            <Vehicle ref="vehicle">
                <h1>J/K I'm an airplane</h1>
            </Vehicle>
        );
    }
});

另外值得一提的是,在React官方文档中,他们更喜欢组合而不是继承:

那么继承呢?在Facebook,我们在成千上万的组件中使用React,但还没有发现建议创建组件继承层次结构的用例。

道具和组合为您提供了以显式且安全的方式自定义组件外观和行为所需的所有灵活性。请记住,组件可以接受任意道具,包括原始值,React元素或函数。

如果要在组件之间重用非UI功能,建议将其提取到单独的JavaScript模块中。组件可以导入它并使用该函数,对象或类,而无需对其进行扩展。

值得一提的另一件事是,使用ES2015 / ES6 +,您还可以将对象道具从Airplane组件传播到Vehicle组件

render: function() {
    return (
        <Vehicle {...this.props}>
            <h1>J/K I'm an airplane</h1>
        </Vehicle>
    );
}


 类似资料:
  • 扩展 Web 组件 Vue.js 是一个独立的前端框架,在浏览器中渲染时不需要基于 Weex 容器。因此,针对 Weex 平台扩展 Vue.js 的 Web 端组件,和直接使用 Vue.js 开发一个 Web 组件是一样的。具体的组件编写方法可以参考其官方文档:组件 ,另外建议使用 .vue 格式的文件编写组件,使用方法参考:单文件组件。 扩展内置组件 目前我们提供了 Vue Render For

  • 问题内容: 我知道您不能动态扩展普通数组,但这是一种有效的方法吗? 我知道比尝试使用普通数组更好的方法,但是我想首先使用普通数组来解决这个问题。 我的愿望是,它从0 + 1(so 1)开始,在被称为new时,它的大小与相同,然后保持不变,同时再次声明,然后将其复制回新的大小。这对我来说很有意义,但我总是会遇到异常情况? 问题答案: 该方法不会更改OrigArray的值;它所做的只是在其中存储一个克

  • 扩展说明 对等网络节点组网器。 扩展接口 org.apache.dubbo.remoting.p2p.Networker 扩展配置 <dubbo:protocol networker="xxx" /> <!-- 缺省值设置,当<dubbo:protocol>没有配置networker属性时,使用此配置 --> <dubbo:provider networker="xxx" /> 已知扩展 org

  • Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)。 下面是一个类似数组的对象,Array.from将它转为真正的数组。 let arrayLike = { '0': 'a', '1': 'b', '2': 'c',

  • jsx 使用上面的代码,im得到控制台错误:

  • 问题内容: 我正在将React.js与TypeScript一起使用。有什么方法可以创建从其他组件继承但具有一些其他道具/状态的React组件? 我想要达到的目标是这样的: 但是,如果我把这个会失败中,我得到一个错误的打字稿(类型的参数是不能分配给类型)。我想这不是TypeScript专用的东西,而是将继承与泛型(?)混合使用的一般限制。是否有任何类型安全的解决方法? 更新 我选择的解决方案(基于D