在构造函数中调用setState会发出警告

时间:2017-08-17 12:22:41

标签: reactjs react-lifecycle

我有一个由其他人编写的代码,其中constructor我已state已初始化,但如果setStateprops,则称为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。但是仍然无法理解构造函数中所做的事情和反应所期望的理想方式。需要一些帮助来理解,构造函数中完成的代码是否正确,如果是,为什么,如果不是,为什么?

3 个答案:

答案 0 :(得分:2)

setState存在的原因是因为组件state是不可变的,并且对其进行更改会导致重新呈现组件。在构造函数中,只需直接在this.state上更改状态。

此外,您无需检查propsundefinedreact是否确保object为您,并且当它undefined时,无论发生了什么严重错误。

答案 1 :(得分:2)

添加已经给出的答案我想指出setState是异步操作。

javascript中的任何构造函数本质上都是必须构造的同步函数,并且"返回"正在构造的类的实例。在构造函数中调用setState会使您处于未确定状态,您/ react不能依赖于组件构造已完成的事实。

答案 2 :(得分:1)

除了将state设置为setState之外,它还具有重新呈现更改的机制。构造函数在实际安装之前执行,不会呈现某些内容。这就是为什么在构造函数中使用setState没有意义。