Javascript 禁用previousState以在React中设置新状态
我正在根据先前的状态更改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
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)
]
})
);
};