React中的构造函数(props)和super(props)VS构造函数()和super()

mr_*_*ash 7 javascript ecmascript-6 reactjs es6-class

我知道这个问题被多次提出过,但现在还不清楚.很多人只是说:

如果要访问this.props那些,请将props传递给构造函数

另一个答案的例子

Oficial doc说类组件应该总是用props调用基础构造函数.,但如果我们不通过propsconstructor,我们仍然有this.props无处不在exept构造.

另外,从反应源代码中我们可以看到React.Component的源代码 function ReactComponent(props, context) { this.props = props; this.context = context; }

但它让我更加困惑. super()应该用两个参数调用:propscontext.但我们调用了我们的超级空,仍然可以访问两个this.props.根据ECMA文档,super()调用constructor()传递给参数的父级super().但我们super()是空的.

所以我的问题是:

  1. 为什么官方文档说:

类组件应始终使用props调用基础构造函数.

  1. React如何设置props为子组件if super()constructor()为空?
  2. React功能的bug是否可以在子组件中访问道具而不传递道具super()constructor()

mr_*_*ash 3

以下是丹·阿布拉莫夫的回答:

但如果我们不传到props constructor 我们仍然会处处 this.props除了 constructor

是的,React在运行this.props后无论如何都会设置 constructor this.props尽管如此,在某些地方有工作而在其他地方却没有工作还是令人困惑。特别是如果这两个 constructor 方法和其他方法都调用一些读取的共享方法this.props。因此,为了避免任何潜在的混乱,我们建议始终致电super(props).

另外,从源代码中Create Element您可以看到,createElement 无论您是否使用,都会添加道具super(props)

createElement()与这个问题没有关系。它创建一个元素,而不是一个实例。

因此,回到您的问题,从技术上讲,仅当您计划this.props constructor 或从 调用的任何方法中访问时才有必要 constructor 。然而,必须记住这一点是相当令人困惑的。您可能知道这一点,但没有致电super(props),但您团队中的下一个人会想要访问this.propsa constructor ,并且会惊讶地发现它不起作用。始终指定它以避免这些问题会更容易。