我正在以正确的方式更新状态?
问题描述:
我有一些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
吗?
答
是的,你必须更新整个state
。如果不更新整个状态并改变现有状态,则父组件不会知道状态已更改并且不会重新呈现,并且不会将任何更改传递给子组件。
如果更改父组件的状态并因此触发重新渲染,则无论如何您都要重新渲染所有子项。 **在React中渲染并不一定是一件坏事**,因为只有前一个渲染和下一个渲染之间的*变化*才会传递给DOM。感觉就像你手动试图选择React应该什么时候完成它的工作以及什么时候不应该那样。 – Jaxx
@Jaxx我知道反应会深入比较状态,所以改变它可能不会反映到DOM。只是不知道它会花多少钱。所以,你的意思是,即使我不把字段项目更改为PureComponent,只是调用它们的渲染函数不是很贵? –
没问题。如果它们的呈现与前一个呈现循环中的呈现完全相同(并且将保持其道具不变),则不会将更改传递到DOM。所以,除非你在你的孩子组件中执行了非常繁重的计算(反正你不应该这样做),否则你只会让自己难过。本质上,让React完成它的工作。 – Jaxx