I have a todo list that holds a delete button in a grandchild, that when clicked fires an event in the parent - I am wanting this event to delete the array entry corresponding to the grandchild clicked.
Parent (contains the array and my attempt at the function)
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 });
}
Any help would be appreciated
Two issues there:
You're seeming to try to direct modify this.state.tasks
. It's important not to do that, never directly modify this.state
or any object on it. See "Do Not Modify State Directly" in the React documentation for state.
You're passing an object to setState
that is derived from the current state. It's important never to do that, too. :-) Instead, pass setState
a function and use the state object it passes you when calling that function. From "State Updates May Be Asynchronous" in the documentation:
Because
this.props
andthis.state
may be updated asynchronously, you should not rely on their values for calculating the next state... [Instead]...use a second form ofsetState()
that accepts a function rather than an object.
(my emphasis)
I figure your remove
on an array was intended to be hypothetical, but for the avoidance of doubt, arrays don't have a remove
method. In this case, the best thing to do, since we need a new array, is to use filter
to remove all entries that shouldn't still be there.
So:
deleteTask(taskToDelete) {
this.setState(prevState => {
const tasks = prevState.tasks.filter(task => task.name !== taskToDelete);
return { tasks };
});
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With