如何修复 不要直接改变状态。将 setState() 与数组一起使用?

Posted

技术标签:

【中文标题】如何修复 不要直接改变状态。将 setState() 与数组一起使用?【英文标题】:How to fix Do not mutate state directly. Use setState() with array? 【发布时间】:2019-10-02 10:02:18 【问题描述】:

我有一个数组 tranches: [ start: moment().format("HH:mm"), end: moment().format("HH:mm") ],当我在没有 setState 的情况下设置 tranches[0].start 的值时,我得到:

Do not mutate state directly. Use setState()

我的代码是:

handleAjouter = (start, end, date) => 
    this.state.tranches[0].start = start;
    this.state.tranches[0].end = end;
    this.setState(
      tranches: this.state.tranches
    );
  

我该如何解决?

【问题讨论】:

【参考方案1】:

克隆 tranches[0] 对象而不是对其进行变异,您可以通过对象传播来简洁地实现:

handleAjouter = (start, end, date) => 
  const [firstTranch] = this.state.tranches;
  this.setState(
    tranches: [
       ...firstTranch, start, end ,
      ...tranches.slice(1)  // needed if the array can contain more than one item
    ]
  );

如果您需要在特定索引处插入更改的 tranch,则克隆数组并插入 tranch:

const tranches = this.state.tranches.slice();
tranches[index] =  ...tranches[index], someOtherProp: 'foo' ;

【讨论】:

谢谢@CertainPerformance,如果我有this.state.tranches[selectedIndex] = ...this.state.tranches[selectedIndex], [startOrEnd]: textValue ; 先切片整个数组,然后你可以重新分配所需索引处的元素 我尝试了 const tranches = this.state.tranches.slice(); tranches[selectedIndex] = ...tranches[selectedIndex], [startOrEnd]: textValue ; this.setState( tranches:this.state.tranches ); 但它不起作用。 您将新状态设置为与旧状态完全相同。使用 new tranches 数组调用 setStatethis.setState( tranches );

以上是关于如何修复 不要直接改变状态。将 setState() 与数组一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

不要直接改变状态,在 React JS 中使用 setState() react/no-direct-mutation-state

如何在我的示例中正确使用 setState()?

ReactJS:为啥我不应该改变嵌套状态?

如何通过构建现有状态来更新 reactjs 应用程序的状态?

我可以改变传递给 setState 函数的状态吗?

更新状态 - 为啥在调用 setState 时创建新的状态副本?