[英]Re-setting the whole state in setState()
我有一个组件,其状态包含endDate
和startDate
(可能还有其他东西,比如要显示的数据数组)。 更改日期范围(使用日期选择器)时,我只是写道:
onDateChangedHandler = (startDate, endDate) => {
this.setState({ startDate, endDate });
}
后来,另一位(经验更丰富的)开发人员提交了一个pull请求,其中包括将此代码更改为:
onDateChangedHandler = (startDate, endDate) => {
const state = Object.assign({ ...this.state, startDate, endDate });
this.setState({ ...state });
}
我问他反馈,但无法得到任何答案。 这里有很多我不明白的事情:
不是没有第二个参数的Object.assign没有意义吗?
从文档中 , Object.assign(target, ...sources)
返回包含合并到其中的源的目标。 因此,如果没有传递的源,它只返回target
使语句无用。
为什么在将state
变量传递给setState()时重新传播?
它应该已经是副本了。
但我的主要问题是:
将整个状态重新传递给setState而不仅仅是修改后的密钥有什么好处?
并且在执行此操作时,是否存在与setState()
相关的任何其他风险?
谢谢!
你的代码更好,你在每一点上都是正确的:
在Object.assign({ ...this.state, startDate, endDate })
,assign只返回由spread创建的对象。 这个{ ...this.state, startDate, endDate }
应该已经足够了。
正确。 您不需要再次克隆它。
它可能会导致问题,因为setState()
是异步的,并且当前this.state
可能已过时。 如果需要在setState()
使用当前状态,请使用updater函数。 例如: setState((prevState) => ({ counter: prevState.counter + 1, startDate, endDate })
。但是,由于在更新状态时不需要包含prev状态,因此可以在此跳过案件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.