Вместо этого вы можете использовать функцию map
.Функция сгенерирует новый массив, который вы можете использовать для замены todos
на.
case "DONE":
const newTodos = state.todos.map((todo, index) => {
// Based on your code, I assume action.payload is the index of the todo in the array of todos
if (index === action.payload) {
const newTodo = {...todo};
todo.done = !todo.done;
return todo;
}
return todo;
});
return {
...state,
todos: newTodos,
};
Если вы не хотите перебирать каждый todo
, вы можете сделать что-то еще, например использовать slice
, чтобы создать копию массива и затем изменить одно значение:
case "DONE":
const newTodos = todos.slice();
const updatedTodo = {...newTodos[action.payload]};
updatedTodo.done = !updatedTodo.done;
newTodos[action.payload] = updatedTodo;
return {
...state,
todos: newTodos,
};