React

时间:2017-11-22 20:06:42

标签: javascript reactjs ecmascript-6 es6-class

我知道这个问题被多次提出过,但它仍然不清楚。 很多人只是说:

  

如果要访问this.props

,请将道具传递给构造函数

one more example of the answer

Oficial doc说Class components should always call the base constructor with props.,但是如果我们没有将props传递给constructor,我们仍会在任何地方执行构造函数this.props

同样从react source code我们可以看到React.Component的源代码 function ReactComponent(props, context) { this.props = props; this.context = context; }

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

所以我的问题是:

  1. 为什么官方文档说:
  2.   

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

    1. 如果propssuper()为空,React如何将constructor()设置为子组件?
    2. 在不将道具传递给super()constructor()的情况下,是否可以在子组件中访问道具的React功能的错误?

2 个答案:

答案 0 :(得分:2)

以下是Dan Abramov的回答:

  

但是,如果我们不将props传递给constructor,我们将仍然拥有   this.propsconstructor以外的任何地方。

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

  

也可以从Create Element的源代码中看到createElement   无论是否使用super(props)

,都会添加道具

createElement()与该问题无关。它创建一个元素,而不是实例。

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

答案 1 :(得分:0)

如果在代码中未为React组件定义构造函数,则可以假定它将自动绑定在幕后,例如:

constructor(props){
    super(props);
}

一旦您明确定义了一个构造函数,就必须记住始终将代码放入其中,否则将被遗漏...您基本上只是在覆盖默认方法:)