-1

我有一个由其他人编写的代码,constructor其中我已经state初始化但也称为setStateif propsundefined代码如下:

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(...): Can only update amounted ormounting component。这通常意味着您在未安装的组件上调用了 setState()。这是一个无操作。

我搜索了一下,发现 setState 不应该在构造函数中调用。但是仍然无法理解在构造函数中所做的事情以及反应所期望的理想方式。需要一些帮助来理解,构造函数中完成的代码是否正确,如果是,为什么,如果不是,为什么?

4

3 回答 3

3

添加到已经给出的答案中,我想指出这setState是一个异步操作。

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

于 2017-08-17T12:41:46.750 回答
2

存在的原因setState是因为组件state是不可变的,对其进行更改会导致重新渲染组件。在构造函数中,直接改变状态就可以了this.state

此外,您无需检查是否propsundefinedreact确保它object适合您,当它是时undefined,无论如何都会发生严重错误。

于 2017-08-17T12:33:42.900 回答
1

除了设置之外statesetState它还具有在更改时重新渲染的机制。构造函数在实际挂载之前执行,并且不会渲染任何内容。setState这就是为什么在构造函数中使用没有意义。

于 2017-08-17T12:26:44.930 回答