es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cambiar la marca de completado para todas las tareas con el uso del Reducer

Intenté convertir mi aplicación de react-todo de useState a useReducer, hice la mayoría de las funcionalidades, pero no pude cambiar la bandera completed en mis tareas completadas. Intenté todas las soluciones posibles, pero no pude resolverlo. Por favor ayúdame con esto, ¿qué debo escribir en el caso TOGGLE_TODO para negar mi Boolean completed?

Función Reductor:

const reducer = (state, action) => {
  switch (action.type) {
    case ACTIONS.setInputText:
      return { ...state, inputText: action.payload.value };
    case ACTIONS.ADD_TODO:
      if (state.inputText.trim()) {
        return {
          ...state,
          todos: [
            ...state.todos,
            { name: state.inputText, id: uuid.v4(), completed: false }
          ],
          inputText: "",
        };
      }
      return state;
    case ACTIONS.DELETE_TODO:
      return {
        ...state,
        todos: state.todos.filter((todo) => todo.id !== action.payload.id)
      };
    case ACTIONS.TOGGLE_TODO:

    default:
      return state;
  }
};

Y aquí está mi componente de todo:

import React from "react";
import tdstyle from "../style/Todo.module.css";
import { ACTIONS } from "../App";

const Todo = ({ text, dispatch, todo }) => {
  return (
    <div classname="{tdstyle.listContainer}">
      <li>{text}</li>
      <div>
        <button onclick="{()" ==""> {
            dispatch({ type: ACTIONS.DELETE_TODO, payload: { id: todo.id } });
          }}
        >
          X
        </button>
        <button onclick="{()" ==""> {
            dispatch({ type: ACTIONS.TOGGLE_TODO, payload: { id: todo.id } });
          }}
        >
          V
        </button>
      </div>
    </div>
  );
};

export default Todo;
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para cambiar el indicador completed en tus todos, puedes escribir el siguiente código en el caso TOGGLE_TODO del reductor:

    case ACTIONS.TOGGLE_TODO:
      return {
        ...state,
        todos: state.todos.map((todo) =>
          todo.id === action.payload.id
            ? { ...todo, completed: !todo.completed }
            : todo
        ),
      };
    

    Aquí, estás recorriendo el arreglo todos en tu estado y verificando si el id del todo actual coincide con el id pasado en la carga útil de la acción. Si coincide, estás devolviendo un nuevo objeto con el indicador completed negado, de lo contrario estás devolviendo el objeto de todo original. El operador de propagación ...state asegura que el resto de tu estado no se vea afectado.

    Esto debería cambiar el indicador completed para el todo correspondiente cuando se envíe la acción TOGGLE_TODO.

Comments are closed.