在构造函数中调用的setState给出警告
我有别人写的代码,其中constructor
在那里我有state
初始化,但也被称为setState
如果props
是undefined
,代码如下:在构造函数中调用的setState给出警告
constructor(props) {
super(props);
this.state = {
subId: props.match.params.subId
}
if(props!==undefined){
this.setState({
subId: props.match.params.subId
});
}
}
当我执行我的模块我在控制台中得到警告warning.js:35警告:setState(...):只能更新已安装或已安装的组件。这通常意味着您在卸载的组件上调用了setState()。这是一个没有操作。
我对它进行了Google搜索,发现setState不应该在构造函数中调用。但仍然无法理解在构造函数中完成的事情以及反应期望的理想方式。需要一些帮助来理解,在构造函数中完成的代码是否正确,如果是,为什么,如果不是,为什么?
除了将state
设置为setState
之外,它还具有在更改时重新呈现的机制。构造函数在实际挂载之前执行,并且不会呈现某些内容。这就是为什么在构造函数中使用setState
没有意义。
如果我没有定义道具会怎么样,我应该在哪里设置状态,而不是在构造函数中执行 –
@OMTheEternity:您可以直接在构造函数内比较'props'。例如:'subId:道具? props.match.params.subId:0' –
谢谢@FiriceNguyen ohhh !!!那就是你忘记愚蠢的事情的那一刻:) –
原因setState
存在是因为组件的state
是不可变的,并且对其进行更改导致重新呈现该组件。在构造函数中,直接在this.state
上更改状态。
而且,你不需要检查props
为undefined
,react
确保它是一个object
你,当它的undefined
,一些严重的错误发生反正。
添加到已经给出的答案我想说明的是setState
是一个异步操作。
JavaScript中的任何构造函数都是由其本质构成的同步函数,它必须构造和“返回”正在构造的类的实例。在构造函数中调用setState
会使您处于未确定状态,您/您的反应不能依赖于组件构造已完成的事实。
有道理..谢谢@Amid –
使用this.state = {//你的状态},调用setState在它被设置之前甚至在组件被挂载之前改变状态,这将违背反应组分 –
if语句不是不必要的吗? – fungusanthrax