我有一个todo列表,其中包含孙子中的删除按钮,当点击时触发父项中的事件 - 我希望此事件删除与点击的孙子对应的数组条目。
Parent(包含数组和我对函数的尝试)
const tasks = [
{ name: 'task1', isComplete: false },
{ name: 'task2', isComplete: true },
{ name: 'task3', isComplete: false },
]
// taskToDelete is the name of the task - doesn't contain an object
deleteTask(taskToDelete) {
this.state.tasks.remove(task => task.name === taskToDelete);
this.setState({ tasks: this.state.tasks });
}
任何帮助将不胜感激
答案 0 :(得分:5)
那里有两个问题:
您似乎试图直接修改this.state.tasks
。这样做非常重要 ,永远不要直接修改this.state
或其上的任何对象。请参阅the React documentation for state中的"不要直接修改状态" 。
您正在将对象传递给从当前状态派生的setState
。重要的是永远不要这样做。 :-)而是传递setState
一个函数,并在调用该函数时使用它传递给你的状态对象。来自"状态更新可能在the documentation中异步" :
由于
this.props
和this.state
可能会异步更新,您不应该依赖其值来计算下一个状态 ... [而是] ...使用setState()
的第二种形式,它接受一个函数而不是一个对象。
(我的重点)
我认为阵列上的remove
是假设的,但为避免疑问,数组不具备remove
方法。在这种情况下,最好的办法是,因为我们需要一个新数组,所以要使用filter
删除所有不应该存在的条目。
所以:
deleteTask(taskToDelete) {
this.setState(prevState => {
const tasks = prevState.tasks.filter(task => task.name !== taskToDelete);
return { tasks };
});
}
答案 1 :(得分:3)
你可以简单地过滤数组:
this.setState(prevState => ({
tasks: prevState.tasks.filter(task => task.name !== 'taskToDelete')
}));
此外,根据this.state
进行更新时,最好使用函数表单,因为setState
为async。
答案 2 :(得分:2)
您可以按照以下方式实施deleteTask(taskToDelete) {
this.setState((prevState, props) => {
const tasks = [...prevState.tasks];
const indexOfTaskToDelete = tasks.findIndex(
task => task.name === taskToDelete
);
tasks.splice(indexOfTaskToDelete, 1);
return { tasks };
});
}
方法:
taskToDelete
一个。找到splice
的索引。
B中。然后使用setState
方法从集合中删除项目
℃。然后拨打tasks
以{{1}}更新状态。
答案 3 :(得分:1)
您可以使用higher order
函数Array#filter
删除任务。
let updatedTasks = this.state.tasks.filter(task => task.name !== taskToDelete);
this.setState({ tasks: updatedTasks });
答案 4 :(得分:0)
您可以使用过滤器在不可变模式之后从数组中删除一个对象(过滤器将创建一个新数组):
deleteTask(taskToDelete) {
const newTaskArray = this.state.tasks.filter(task => task.name !== taskToDelete);
this.setState({ tasks: newTaskArray });
}
编辑:解决方案的代码交付:https://codepen.io/Dyo/pen/ZvPoYP
答案 5 :(得分:0)
我已按照以下步骤从状态数组中删除特定的选定对象:
这里我使用的是复选框列表,当我选择一个复选框时,它将添加到状态数组中,而当取消选中它时,它将被从数组中删除。
if (checked) {
var tempObject = { checkboxValue: data, label: title }
this.state.checkBoxState.push(resTemp);
} else {
var element = data; //data is coming from different method.
for (let index = 0; index < this.state.checkBoxState.length; index++) {
if (element === this.state.checkBoxState[index].checkboxValue) {
this.state.checkBoxState.splice(index, 1);
}
}
}
我被这个问题困住了,我正在分享我的解决方案。希望对您有帮助。