Я получаю значение null, когда использую find в массиве — redux

#arrays #reactjs #redux #react-redux #redux-toolkit

Вопрос:

У меня есть 3 действия ( add_todo,delete_todo,completed_todo). Добавление и удаление работает нормально, но я должен добавить удаленные элементы в завершенный список, чтобы отобразить их в отдельном компоненте. Но всякий раз, когда я пытаюсь использовать, фильтровать или находить удаленные элементы, я получаю нулевое значение.

Код редуктора :

 const initialState = {
  todos: [],
  completed: [],
};

const todoSlice = createSlice({
  name: "todos",
  initialState,
  reducers: {
    add_todo(state, action) {
      state.todos = [...state.todos, action.payload];
    },
    delete_todo(state, action) {
      state.todos = state.todos.filter((todo) => todo.id !== action.payload);
    },
    completed_todo(state, action) {
      console.log(state.todos.find((todo) => todo.id === action.payload));
      state.completed = [
        ...state.completed,
        state.todos.filter((todo) => todo.id === action.payload),
      ];
    },
  },
});

export const todoActions = todoSlice.actions;

export const selectTodo = (state) => state.todos.todos;

export default todoSlice.reducer;
 

код, по которому я вызываю или отправляю свои действия:

 function TodoList() {
  const dispatch = useDispatch();
  const todos = useSelector(selectTodo);
  const handleDelete = (id) => {
    dispatch(todoActions.delete_todo(id));
    dispatch(todoActions.completed_todo(id));
  };
// Some code and a button with handleDelete 
}
 

Ответ №1:

Действия будут отправляться одно за другим. После первого действия вы удалите задание из своего состояния . dispatch(todoActions.delete_todo(id)); .filter((todo) => todo.id !== action.payload)

После этого отправляется второе действие dispatch(todoActions.completed_todo(id)); . Но state.todos.find((todo) => todo.id === action.payload) не найдете его, так как он уже удален.

Чтобы исправить это, вы можете поменять местами свои диспетчерские звонки. Сначала заполните его, а затем удалите. Проблема решена 🙂

Ответ №2:

Проблема здесь в том, что к тому времени, когда вы отправляете действие для получения завершенного списка, ваши удаленные задачи уже исчезли из состояния . Вместо отправки 2 действий . вы можете делать то, о чем вас просят в delete todo действии .

 delete_todo(state, action) {
      // find the todo to delete 
      const deletedTodo = state.todos.find((todo) => todo.id === action.payload);
       state.completed = [
        ...state.completed,
        deletedTodo,
      ];
      state.todos = state.todos.filter((todo) => todo.id !== action.payload);
    },
 

поскольку ваше завершенное задание-это не что иное, как задание, которое вы пытаетесь удалить . ИМХО логично сделать это в том же действии, которое мы используем для отправки для удаления задачи .