2017-08-17 159 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在它被設置之前甚至在組件被掛載之前改變狀態,這將違背反應組分 –

相關問題