Почему логический переключатель redux toolkit не работает?

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

Вопрос:

Я сохраняю логическое значение под названием «Завершено», но оно не работает. Оно становится истинным, когда ложно, но не становится ложным снова впоследствии. Действие Redux и функция, которую я написал, следующие. В чем может быть причина этого? Спасибо за заранее.

 const todoSlice = createSlice({
    name: 'todos',
    initialState: {
        todos: []
    },
    reducers: {
        addTodo: (state, action) => {
            state.todos = [...state.todos, action.payload]
        },
        deleteTodo: (state, action) => {
            state.todos = action.payload
        },
        completedTodo: (state, action) => {
            state.todos = action.payload
        }
    }
})

export const {
    addTodo,
    deleteTodo,
    completedTodo
} = todoSlice.actions

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

export const store = configureStore({
    reducer: todoSlice.reducer
})
 
 const Todo = () => {
    const user = useSelector(selectUser);
    const dispatch = useDispatch();

    const checkHandler = (id) => {
        const dene = user.map((item) => {
            if (item.id === id) {
                const comp = item.isCompleted
                return {
                    ...item,
                    isCompleted: !item.isCompleted
                };
            }
        })
        dispatch(completedTodo({dene}))
    }

    const deleteHandler = (id) => {
        const filteredTodos = user.filter(todo => todo.id !== id)
        dispatch(deleteTodo(filteredTodos))
    }

    return (
        user.map((todo) => {
            return <li key={todo.id} className={todo.isChechked ? "todo-item checked" : "todo-item"}>
                <p>{todo.title}</p>
                <div className="btns">
                    <IconButton onClick={() => deleteHandler(todo.id)} className="trash-btn" aria-label="delete">
                        <DeleteIcon />
                    </IconButton>
                    <IconButton onClick={() => checkHandler(todo.id)} className="complete-btn" aria-label="delete">
                        <CheckIcon />
                    </IconButton>
                </div>
            </li>
        })
    )
}

export default Todo
 

Каков наилучший метод логического переключения для Redux?

Ответ №1:

Вы забыли вернуть другие todo элементы в .map() функции. Это приведет к state.todos неправильному.

 const dene = user.map((item) => {
  if (item.id === id) {
    return {
      ...item,
      isCompleted: !item.isCompleted,
    };
  }
  // notice here
  return item;
});

dispatch(completedTodo(dene));
 

Передайте создателю dene действия напрямую, вы можете получить dene входящий редуктор action.payload .