2017-10-15 63 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。如果不更新整个状态并改变现有状态,则父组件不会知道状态已更改并且不会重新呈现,并且不会将任何更改传递给子组件。

相关问题