2017-08-17 155 views
-1

我有别人写的代码,其中constructor在那里我有state初始化,但也被称为setState如果propsundefined,代码如下:在构造函数中调用的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不应该在构造函数中调用。但仍然无法理解在构造函数中完成的事情以及反应期望的理想方式。需要一些帮助来理解,在构造函数中完成的代码是否正确,如果是,为什么,如果不是,为什么?

+0

if语句不是不必要的吗? – fungusanthrax

回答

1

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

+0

如果我没有定义道具会怎么样,我应该在哪里设置状态,而不是在构造函数中执行 –

+1

@OMTheEternity:您可以直接在构造函数内比较'props'。例如:'subId:道具? props.match.params.subId:0' –

+0

谢谢@FiriceNguyen ohhh !!!那就是你忘记愚蠢的事情的那一刻:) –

1

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

而且,你不需要检查propsundefinedreact确保它是一个object你,当它的undefined,一些严重的错误发生反正。

+0

这增加了我的知识,谢谢 –

+0

但是,如果道具没有定义,那么状态是否被初始化? –

+1

你说得对。状态总是一个对象,构造函数中的赋值只是给它添加属性,否则它是空的。 – Tr1et

1

添加到已经给出的答案我想说明的是setState是一个异步操作。

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

+0

有道理..谢谢@Amid –

+0

使用this.state = {//你的状态},调用setState在它被设置之前甚至在组件被挂载之前改变状态,这将违背反应组分 –

相关问题