繁体   English   中英

在setState()中重新设置整个状态

[英]Re-setting the whole state in setState()

我有一个组件,其状态包含endDatestartDate (可能还有其他东西,比如要显示的数据数组)。 更改日期范围(使用日期选择器)时,我只是写道:

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()相关的任何其他风险?

谢谢!

你的代码更好,你在每一点上都是正确的:

  1. Object.assign({ ...this.state, startDate, endDate }) ,assign只返回由spread创建的对象。 这个{ ...this.state, startDate, endDate }应该已经足够了。

  2. 正确。 您不需要再次克隆它。

  3. 它可能会导致问题,因为setState()是异步的,并且当前this.state可能已过时。 如果需要在setState()使用当前状态,请使用updater函数。 例如: setState((prevState) => ({ counter: prevState.counter + 1, startDate, endDate }) 。但是,由于在更新状态时不需要包含prev状态,因此可以在此跳过案件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM