Construye una Emoji Todo List con React + TypeScript y la librería de Substance conectando un hook de store, gestionando state local y mapeando texto a emojis. Verás cómo agregar con Enter, renderizar la UI y eliminar ítems con un clic, tal como se implementa paso a paso.
¿Cómo conectar el hook use todo store en un React functional component?
Para iniciar, se define el componente como React Functional Component y se consume el hook personalizado use todo store para obtener todos, add todo y remove todo. Así se pinta el estado inicial y se preparan las acciones para modificarlo.
// Dentro de TodoList (React + TypeScript)const todos =useTodoStore((state)=> state.todos);const addTodo =useTodoStore((state)=> state.addTodo);const removeTodo =useTodoStore((state)=> state.removeTodo);const[todoText, setTodoText]=useState('');
use todo store: expone todos, add todo y remove todo.
Estado local con useState: captura y modifica la entrada del input.
Pintado inicial: se renderiza la lista con el estado del store.
¿Cómo gestionar el estado local del input?
Se crea todoText con useState('') para escribir y limpiar el campo tras cada inserción.
consthandleAddTodo=()=>{// mapeo a emoji se aplica aquí más adelanteaddTodo(todoText);setTodoText('');};
Captura la entrada del usuario.
Agrega el todo y limpia el campo.
¿Cómo disparar la acción con enter?
No se usa botón. Se detecta la tecla Enter con un KeyboardEvent y se llama a handleAddTodo.
¿Cómo mapear palabras a emojis con TypeScript de forma segura?
Se define un emoji map como objeto clave-valor para transformar palabras como "it" o "sleep" en emojis. Con TypeScript, se tipa como Record<string, string> para validar que tanto la clave como el valor sean string.
Record<string, string>: tipado claro de clave y valor.
toLowerCase(): tolerancia a mayúsculas del usuario.
?? todoText: si no hay coincidencia, usa el texto original.
trim(): evita espacios innecesarios.
¿Cómo renderizar la UI y conectar eventos en React?
Se define el return con un contenedor, el texto “made with Substance”, el título “Emoji Todo List”, el input controlado y la lista de elementos desde el store. Cada elemento se remueve con onClick pasando su id.
return(<div><p>made with Substance</p><h2>Emoji Todo List</h2><inputtype="text"value={todoText}onChange={(e)=>setTodoText(e.target.value)}onKeyDown={handleKeyDown}placeholder="Add a new todo"/><ul>{todos.map((todo)=>(<likey={todo.id}onClick={()=>removeTodo(todo.id)}>{todo.text}</li>))}</ul></div>);
export default para evitar errores de importación.
Estilos listos desde index.css ya preparado.
Además, se probó la interacción escribiendo “it”, “sleep” y “exercise”, confirmando el mapeo a emojis y la eliminación con clic. Se mencionó que este Emoji Todo List se trabajó con Redux y con Substance, comparando diferencias de uso.
¿Con cuál te quedas: Redux o Substance? Cuéntame en comentarios y por qué elegiste esa opción.
En TypeScript, el uso de corchetes cuadrados en una interfaz indica que estás definiendo un tipo de índice. Esto permite que la interfaz tenga propiedades dinámicas basadas en un tipo de clave específico. Por ejemplo, si tienes [key: string]: SomeType, significa que puedes tener propiedades con nombres variables, donde key es la clave que puede ser cualquier string, y SomeType es el tipo de valor que se asigna a esa clave. Esto es útil para manejar estructuras de datos donde las propiedades no son fijas, como un objeto que representa estados en una máquina de estados.
Sí, puedes hacer una destructuración del hook de Zustand de la manera que indicas. Usando const { todos, addTodo, removeTodo } = useTodoStore(), podrás acceder directamente a las propiedades del store. Esto simplifica la referencia a las funciones y el estado dentro de tu componente.
Recuerda que al destructurar, asegúrate de que los nombres coincidan con los que definiste en el store. Así, tu código se verá más limpio y evitarás repetir useTodoStore() cada vez que necesites acceder a esos valores.
Esto elimina la versatilidad de suscripciones parciales pudiendo provocar renders innecesarios, aunque sí, se ve muchisimo más limpio el código de esa forma
me quedo con zustand, me parece mucho más sencillo.
Eso es uno de los objetivos de Zustand. Recomendado 100%.
Ya vi la misma implementación 3 veces seguidas, con algunos cambios de implementación. Creo que me estoy empezando a volver loco
Así es, lo siento demasiado básico para ser un curso avanzado de react.
Se puede usar Redux DevTools con Zustand, usando devtools de la siguiente forma:
En resumen, en Zustand necesitamos crear un store o tienda de estado, donde almacenamos datos que queremos gestionar globalmente en la aplicación. Para lograrlo, usamos la función create, que recibe un callback donde definimos tanto el estado inicial como las funciones necesarias para modificarlo.
set es una función que se usa para actualizar el estado, recibe el estado actual y retorna el estado actualizado
Así es, puedes destructurarlo y te queda más limpio, con la salvedad que debes pasarle el mismo callback que muestra la profesora, pero retornando solo el estado, así:
Lástima que el bloque de código no muestre caracteres especiales como mayor qué y menor qué :(
En el video la maestra Estefany comenta que Zustand se puede usar para aplicaciones pequeñas y medianas, esto significa que es algo asi como context?, ya que redux es mas complejo de usar por el estado y todos los eventos que se deben de manejar en una pagina?