Javascript 禁用previousState以在React中设置新状态

Javascript 禁用previousState以在React中设置新状态,javascript,arrays,reactjs,state,splice,Javascript,Arrays,Reactjs,State,Splice,我正在根据先前的状态更改React中的状态。基本上,我是从一个项目数组中删除一个项目,我想要最简单的方法 这很好,但可能不是最佳实践 handleItemsRemove = (id, index) => { if (index === -1) { return; } this.setState( previousState => { const { items } = previousState; ite

我正在根据先前的状态更改React中的状态。基本上,我是从一个项目数组中删除一个项目,我想要最简单的方法

这很好,但可能不是最佳实践

handleItemsRemove = (id, index) => {
    if (index === -1) {
      return;
    }
    this.setState(
      previousState => {
        const { items } = previousState;
        items.splice(index, 1);
        return {
          items
        };
      }
    );
  };
是否有任何关于此代码的问题涉及到修改之前状态的易变性等?
previousState
是可变的,即使是可变的,也可以这样做吗

你认为处理这种情况的最佳方法是什么?

< P>方法修改原始数组-所以这不是你需要的方式。

相反,您可以过滤掉不需要的项目。请阅读有关创建新数组的方法的更多信息

此外,不需要为整个状态创建变量。相反,您可以使用:

从:

切勿直接对该状态进行变异
,因为之后调用
setState()
可能会替换您进行的变异。将
此.state
视为是不可变的

我不确定这是否适用于你的情况,但建立一个全新的安全对象。您可以使用
items.slice(0,index)
获取
index
之前的数组部分和
items.slice(index+1)
获取
index
之后的部分,然后将它们覆盖到新数组上:

handleItemsRemove = (id, index) => {
  if (index === -1) {
    return;
  }
  this.setState(
    ({items}) => ({
      items: [
        ...items.slice(0, index),
        ...items.slice(index + 1)
      ]
    })
  );
};

的确如此。我在想Redux.哦,我是。。我不使用Redux:),但由于您使用的是
设置状态
,因此您可以100%相信该状态将被合并,无需传播其他..这些都没有从此处更改。我已删除了我的答案,但我可以帮助您了解另一个想法。。而不是创建这么多中间数组。。执行
previousState.items.slice().splice(索引,1)
。。。它更干净更快。@ArupRakshit回答得很好。您应该将此添加为新答案。我认为这实际上是最好的解决方案。我不喜欢这个解决方案,因为它在整个阵列中循环,而我已经知道从哪里删除。
handleItemsRemove = (id, index) => {
  if (index === -1) {
    return;
  }
  this.setState(
    ({items}) => ({
      items: [
        ...items.slice(0, index),
        ...items.slice(index + 1)
      ]
    })
  );
};