2017-10-15 99 views
0

我有一些state,看起來像這樣:我正在以正確的方式更新狀態?

{ 
    formStatus: { 
    isFormOK: false, 
    fields: { 
     field1: { 
     status: 'normal', 
     errorText: '', 
     value: '' 
     }, 
     field2: { 
     status: 'error', 
     errorText: 'must be an email', 
     value: '' 
     }, 
    } 
    } 
} 

是的,這是對父表state,它有一些表單字段作爲其子。

比方說,我想更新某個域的屬性,例如:field1.status,由於上述state是一個嵌套的對象,我會用更新的值一起創建一個新的state,以維持整個state不變。

但很明顯,我每次setState,因爲state已經成爲一個全新的對象,就會觸發render()爲所有的孩子組件(所有字段項),所以我改變所有的孩子從stateless component實施到React.PureComponent。它似乎處理這個問題。

我是否正確地做事情?似乎到達那裏需要很多。

我真的要更新整個state嗎?

+0

如果更改父組件的狀態並因此觸發重新渲染,則無論如何您都要重新渲染所有子項。 **在React中渲染並不一定是一件壞事**,因爲只有前一個渲染和下一個渲染之間的*變化*纔會傳遞給DOM。感覺就像你手動試圖選擇React應該什麼時候完成它的工作以及什麼時候不應該那樣。 – Jaxx

+0

@Jaxx我知道反應會深入比較狀態,所以改變它可能不會反映到DOM。只是不知道它會花多少錢。所以,你的意思是,即使我不把字段項目更改爲PureComponent,只是調用它們的渲染函數不是很貴? –

+1

沒問題。如果它們的呈現與前一個呈現循環中的呈現完全相同(並且將保持其道具不變),則不會將更改傳遞到DOM。所以,除非你在你的孩子組件中執行了非常繁重的計算(反正你不應該這樣做),否則你只會讓自己難過。本質上,讓React完成它的工作。 – Jaxx

回答

0

是的,你必須更新整個state。如果不更新整個狀態並改變現有狀態,則父組件不會知道狀態已更改並且不會重新呈現,並且不會將任何更改傳遞給子組件。

相關問題