如何从状态数组中删除项?
如何从状态数组中删除项?
故事是,我应该能够把Bob、Sally和Jack放进一个盒子里。我也可以将其中任何一个人从盒子里拿出来。当被移除时,不会留下任何空位。\n现在我需要移除,比如说\"Bob\"。新的数组将是:\n[\"Sally\", \"Jack\"]\n这是我的React组件:\n...\ngetInitialState: function() {\n return{\n people: [],\n }\n},\nselectPeople(e){\n this.setState({people: this.state.people.concat([e.target.value])})\n},\nremovePeople(e){\n var array = this.state.people;\n var index = array.indexOf(e.target.value); // 假设是Bob。\n delete array[index];\n},\n...\n这里我给你展示了一个最简代码,因为还有更多内容(例如onClick等)。关键部分是从数组中删除、移除、销毁\"Bob\",但是当调用removePeople()时它不起作用。有任何想法吗?我在这里参考了这个,但是可能是因为我在使用React时做错了什么。
在上述代码中,有一个名为"removePeople"的函数,它被用于从"state"数组中删除项目。然而,文章没有提供问题的具体描述。从代码中可以推测出问题的原因是要删除"state"数组中的项目,但没有给出具体的解释。
解决方法是通过使用ES6的箭头函数和filter方法来实现。首先,通过使用filter方法来创建一个名为"filteredArray"的新数组,该数组不包含与"e.target.value"相等的项目。然后,使用setState方法将"filteredArray"设置为新的"people"状态值,从而更新"state"数组。
这就是一个简单的删除"state"数组中项目的解决方法。
如何从状态数组中删除一个项?
原因:在使用React时,应该避免直接改变状态。应该创建一个新的数组并使用setState()。
解决方法:
为了从数组中删除一个元素,只需执行以下操作:
array.splice(index, 1);
在你的情况下:
removePeople(e) { var array = [...this.state.people]; // 创建一个数组的副本 var index = array.indexOf(e.target.value) if (index !== -1) { array.splice(index, 1); this.setState({people: array}); } }
在我的情况下是:`array.splice(array, 1);` 谢谢
`array.splice(array, 1);`?我猜你需要编辑它...你应该使用不同的变量...
每个答案部分起作用,但当点击另一个人的“删除”按钮时,它会删除错误的人。Aleksandr Petrov的答案效果最好,但它会在数组中留下null值,所以我使用了`array.splice(index, 1);`。向Aleksandr Petrov表示感谢。您的答案有效,让我们对答案做出细微的调整。
如果我有一个与people不同的状态对象,它会被丢弃吗?
我建议在这种情况下使用Array.from(this.state.items)而不是扩展运算符。这是因为Array.from专门用于这种用途。
在这种情况下,'e'是什么?我应该传递什么值来调用removePeople()函数?如果这是一个非常基本的问题,我很抱歉,我只是一个学习者。
小建议,在对数组进行splice操作之前,添加一个对“index !== -1”的检查,以防止意外删除。
这是反模式。splice函数会改变相同的数组。
这可能是React Native最糟糕的事情。
它是React的罪魁祸首。
为什么要复制people列表可能很大?而不是使用数组过滤器返回一个新数组。
在使用React时,永远不要直接改变状态。如果改变了一个对象(或者Array
,也是一个对象),应该创建一个新的副本。
有人建议使用Array.prototype.splice()
,但是该方法会改变数组,所以最好不要在React中使用splice()
。
最简单的方法是使用Array.prototype.filter()
来创建一个新数组:
removePeople(e) { this.setState({people: this.state.people.filter(function(person) { return person !== e.target.value })}); }
这是一种声明式的方式。另一种方法是使用prevState和箭头函数:
this.setState(prevState => ({ people: prevState.people.filter(person => person !== e.target.value) }));
这应该是接受的答案,符合React的习惯,不会改变状态。
或者使用索引:
this.state.people.filter((_, i) => i !== index)
这个答案的问题是,如果有几个人有相同的名字,你会把它们全部删除。使用索引在可能存在重复的情况下更安全。
哦,谢谢。我花了一段时间才找到这个信息...我无法区分splice
和slice
之间的小差异(一个字符)。我一直在使用slice
,但是看到了关于splice
的介绍...哎。
你可能正在对集合进行map
操作,以便在某个地方显示它们,这需要一个key
(应该使用项目的索引)。如果你在map
块中渲染删除操作/元素,应该将索引传递给删除元素的函数。如果有很多项,通过索引删除一个项更合理,而不是遍历所有项进行过滤。根据过滤条件,你还可能删除多个元素,这可能不是你的意图。无论你做什么,确保不要进行改变。这个答案可能是错误的吗?状态更新可能是异步的。