我有一个由其他人编写的代码,其中constructor
我已state
已初始化,但如果setState
为props
,则称为undefined
,代码如下:
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()。这是一个无操作。
我搜索了它,发现不应该在构造函数中调用setState。但是仍然无法理解构造函数中所做的事情和反应所期望的理想方式。需要一些帮助来理解,构造函数中完成的代码是否正确,如果是,为什么,如果不是,为什么?
答案 0 :(得分:2)
setState
存在的原因是因为组件state
是不可变的,并且对其进行更改会导致重新呈现组件。在构造函数中,只需直接在this.state
上更改状态。
此外,您无需检查props
是undefined
,react
是否确保object
为您,并且当它undefined
时,无论发生了什么严重错误。
答案 1 :(得分:2)
添加已经给出的答案我想指出setState
是异步操作。
javascript中的任何构造函数本质上都是必须构造的同步函数,并且"返回"正在构造的类的实例。在构造函数中调用setState
会使您处于未确定状态,您/ react不能依赖于组件构造已完成的事实。
答案 2 :(得分:1)
除了将state
设置为setState
之外,它还具有重新呈现更改的机制。构造函数在实际安装之前执行,不会呈现某些内容。这就是为什么在构造函数中使用setState
没有意义。