我知道这个问题被多次提出过,但它仍然不清楚。 很多人只是说:
如果要访问
,请将道具传递给构造函数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()
:props
和context
。但我们调用了我们的超级空,仍然可以访问两个this.props
。
根据ECMA文档super()
调用父constructor()
,参数传递给super()
。但我们的super()
是空的。
所以我的问题是:
类组件应始终使用props调用基础构造函数。
props
和super()
为空,React如何将constructor()
设置为子组件? super()
和constructor()
的情况下,是否可以在子组件中访问道具的React功能的错误?答案 0 :(得分:2)
以下是Dan Abramov的回答:
但是,如果我们不将
props
传递给constructor
,我们将仍然拥有this.props
除constructor
以外的任何地方。
是的,在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);
}
一旦您明确定义了一个构造函数,就必须记住始终将代码放入其中,否则将被遗漏...您基本上只是在覆盖默认方法:)