装饰器或子类化是React.Component的最佳模式
Decorators or subclassing is best pattern for React.Component
推荐哪种方式,为什么?
way_1:(使用继承)
class BaseComponent extends React.Component {
//Other functions
log = (msg) => {
console.log(`[${this.constructor.name}]`, msg);
}
//Other functions
}
export default BaseComponent;
class XyzComponent extends BaseComponent {
//Other functions
someFunction = () => {
this.log("Some log");
}
//Other functions
}
export default XyzComponent;
way_2:(使用装饰器)
function withLog(ComposedComponent) {
return class withLog extends Component {
log = (msg) => {
console.log(`[${this.constructor.name}]`, msg);
}
}
};
export default withLog;
@withLog
class XyzComponent extends React.Component {
//Other functions
someFunction = () => {
this.log("Some log");
}
//Other functions
}
我喜欢way_1,因为它看起来像其他基于OOP的语言。这使得恒定性和更容易理解。但在其他地方,人们都在谈论装饰师。所以我有点困惑。
人们可能会回收装饰器,因为他们内化了您想要的功能。
当您在第一个示例中从BaseComponent
继承时,您在XyzComponent
和BaseComponent
之间创建了一个强(继承)依赖关系。然后,对BaseComponent
的任何更改都可能对XyzComponent
s产生间接影响。
更可能的情况是,稍后您决定更改XyzComponent
的日志记录方法。如果采用第一种方法,可能很难"去掉中间部分"并从React.Component
继承,因为代码库的其他部分可能通过其BaseComponent
超类访问XyzComponent
。在这种情况下,您必须确保您的修改不会违反BaseComponent
的合同。
因此,尽管继承方法很容易掌握,而且非常面向对象,但可能会在以后引起头痛。如果你意识到这些令人头疼的问题,请做出判断——我个人认为,当装饰师更间接时,继承是不言自明的。
(这个答案可以总结为:"比起继承,更喜欢构图")
相关文章:
- 将 React Component 值转换为 vanilla Javascript
- React 和 HTML Select-component 返回 String 而不是 Integer 的最佳方式
- jQuery样式在React Component中不起作用
- jquery gridster react component
- React Component and CSSTransitionGroup
- 如何在React Component NPM模块中引用图像
- 装饰器或子类化是React.Component的最佳模式
- React.Component是导出时的默认扩展
- 使用Jest测试React Component函数
- 外部react组件看不到react . component
- React组件有必要从React. component扩展吗?
- React High Level Component在多次使用时不会更新
- React: Component'的子元素不应该被改变
- 下面的模式是如何工作的const {Component} = React
- 在创建React组件时,我应该使用功能组件吗?创建或扩展React.Component
- 得到警告:React组件类必须扩展React. component.在反应
- 使用react-mason -component有困难
- 如何使用React + React- router - component手动导航到路由
- Import React vs React, { Component }
- react-router-component将所有url路由到同一个组件