5-Actualizar una Tarea en React
Actualizar una Tarea en React: Guía Paso a Paso
En este post, implementaremos la funcionalidad para editar tareas en nuestra aplicación de lista de tareas. Integraremos la función handleUpdate con el código existente y explicaremos cada paso en detalle.
📌 Código Completo (Con Actualización Integrada)
import { useState } from "react";
import Todo from "./todo";
import "./todoApp.css";
export default function TodoApp() {
// Estados
const [title, setTitle] = useState("");
const [todos, setTodos] = useState([]);
// Función para agregar una tarea
function handleSubmit(e) {
e.preventDefault();
const newTodo = {
id: Date.now(),
title: title,
completed: false,
};
setTodos([newTodo, ...todos]);
setTitle("");
}
// Función para eliminar una tarea
function handleDelete(id) {
const filteredTodos = todos.filter((item) => item.id !== id);
setTodos(filteredTodos);
}
// Función para actualizar una tarea
function handleUpdate(id, newTitle) {
const updatedTodos = todos.map((item) => {
if (item.id === id) {
return { ...item, title: newTitle }; // Actualiza solo el título
}
return item; // Mantiene los demás elementos igual
});
setTodos(updatedTodos);
}
return (
<div className="todoContainer">
{/* Formulario para agregar tareas */}
<form onSubmit={handleSubmit} className="todoCreateForm">
<input
onChange={(e) => setTitle(e.target.value)}
value={title}
className="todoInput"
placeholder="Escribe una nueva tarea"
/>
<input type="submit" value="Crear tarea" className="buttonCreate" />
</form>
{/* Lista de tareas */}
<div className="todosContainer">
{todos.map((item) => (
<Todo
key={item.id}
item={item}
onDelete={() => handleDelete(item.id)}
onUpdate={(newTitle) => handleUpdate(item.id, newTitle)} // Pasamos la función de actualización
/>
))}
</div>
</div>
);
}🔧 Explicación Paso a Paso
1. Función handleUpdate(id, newTitle)
Esta función recibe:
id→ Identificador único de la tarea a editar.newTitle→ Nuevo texto de la tarea.
function handleUpdate(id, newTitle) {
const updatedTodos = todos.map((item) => {
if (item.id === id) {
return { ...item, title: newTitle }; // Actualiza solo el título
}
return item; // Mantiene los demás elementos igual
});
setTodos(updatedTodos);
}📌 ¿Qué hace todos.map()?
Crea un nuevo array con las tareas actualizadas.
{ ...item, title: newTitle }copia todas las propiedades de la tarea (id,completed) y solo modificatitle.
📌 ¿Por qué setTodos(updatedTodos)?
Actualiza el estado
todoscon el nuevo array.React re-renderiza la lista automáticamente.
2. Pasando handleUpdate al Componente <Todo>
El componente TodoApp envía la función onUpdate como prop a cada <Todo>:
<Todo
key={item.id}
item={item}
onDelete={() => handleDelete(item.id)}
onUpdate={(newTitle) => handleUpdate(item.id, newTitle)} // Pasamos la función de actualización
/>📌 ¿Por qué (newTitle) => handleUpdate(item.id, newTitle)?
Pasamos una función personalizada que recibe el
newTitley llama ahandleUpdatecon elidcorrecto.
3. Implementación en el Componente <Todo>
Dentro de Todo.js, implementamos el modo edición:
import { useState } from "react";
export default function Todo({ item, onDelete, onUpdate }) {
const [isEditing, setIsEditing] = useState(false);
const [editedTitle, setEditedTitle] = useState(item.title);
// Función para guardar cambios
function handleSave() {
onUpdate(editedTitle); // Llama a onUpdate con el nuevo título
setIsEditing(false); // Desactiva el modo edición
}
return (
<div className="todo">
{isEditing ? (
// Modo edición
<div className="editMode">
<input
value={editedTitle}
onChange={(e) => setEditedTitle(e.target.value)}
/>
<button onClick={handleSave}>Guardar</button>
<button onClick={() => setIsEditing(false)}>Cancelar</button>
</div>
) : (
// Modo visualización
<div className="viewMode">
<span>{item.title}</span>
<button onClick={() => setIsEditing(true)}>Editar</button>
<button onClick={onDelete}>Eliminar</button>
</div>
)}
</div>
);
}📌 Flujo de Actualización:
El usuario hace clic en "Editar" → Activa
isEditing.Se muestra un
inputcon el texto actual (editedTitle).El usuario edita el texto →
setEditedTitleactualiza el estado local.Al hacer clic en "Guardar":
Llama a
onUpdate(editedTitle)(que ejecutahandleUpdateenTodoApp).React actualiza la lista y cierra el modo edición.
🎯 Diagrama de Flujo
1. Botón "Editar" en `<Todo>` → Activa `isEditing`
2. Input muestra `editedTitle` (estado local)
3. Cambios en el input → Actualiza `editedTitle`
4. Botón "Guardar" → Ejecuta `onUpdate(editedTitle)`
5. `handleUpdate` en `TodoApp` modifica `todos`
6. React re-renderiza la lista con el cambio💡 Mejoras Opcionales
Validación de campos vacíos:
function handleSave() { if (editedTitle.trim() === "") { alert("El texto no puede estar vacío"); return; } onUpdate(editedTitle); setIsEditing(false); }Focus automático al editar:
// Usa useRef y useEffect para enfocar el input const inputRef = useRef(null); useEffect(() => { if (isEditing) inputRef.current.focus(); }, [isEditing]);Edición con Enter:
<input value={editedTitle} onChange={(e) => setEditedTitle(e.target.value)} onKeyDown={(e) => e.key === "Enter" && handleSave()} />
🚀 Conclusión
Usamos
mappara actualizar el array sin mutar el estado original.Pasamos funciones entre componentes (
onUpdate) para mantener la lógica centralizada.Modo edición local en
<Todo>mejora la experiencia de usuario.
¡Con esto ya tienes un CRUD completo (Crear, Leer, Actualizar, Eliminar)! En próximos posts añadiremos filtros y persistencia en localStorage.
___________________________________________________________________
Dominando la Actualización de Estado en React: La Función handleUpdate
¡Saludos desarrolladores! 🌟 Continuemos explorando el flujo de datos en React, esta vez con una función clave para cualquier aplicación interactiva: actualizar estado de forma inmutable. Vamos a diseccionar handleUpdate y su viaje entre componentes.
🔍 La Función handleUpdate: Actualización Inmutable
function handleUpdate(id, newTitle) {
const updatedTodos = todos.map(item => {
if (item.id === id) {
return { ...item, title: newTitle }; // ¡Magia inmutabilidad!
}
return item;
});
setTodos(updatedTodos);
}Qué hace:
Mapea inteligentemente: Crea un nuevo array recorriendo
todos.Encuentra el ítem: Compara IDs hasta hallar el elemento a modificar.
Clona y actualiza: Usa el spread operator (
...) para copiar el objeto y sobrescribir solotitle.Conserva otros ítems: Devuelve los elementos no modificados intactos.
Setea nuevo estado: Actualiza el estado con el array completamente nuevo.
⚙️ Comunicación entre Componentes: El Baile de las Props
Flujo completo:
TodoAppdefine la lógica
La funciónhandleUpdatenace aquí porque el estadotodoses su responsabilidad.Pasa la función como prop
Al renderizar cadaTodo, le entrega un "control remoto" para solicitar actualizaciones:<Todo onUpdate={handleUpdate} /* otras props */ />Todocaptura la acción del usuario
Cuando el usuario edita:// En Todo.js function handleSubmit(e) { e.preventDefault(); onUpdate(item.id, value); // ¡Dispara hacia arriba! }TodoAppejecuta la actualización
Recibe el ID y nuevo título, procesa el cambio y genera un NUEVO estado.Re-render automático
React actualiza todos los componentes afectados con los nuevos datos.
🧩 ¿Por qué este flujo es PODEROSO?
Inmutabilidad garantizada
map()+ spread operator aseguran que:✅ No mutamos el estado original
✅ Detectamos cambios eficientemente
✅ Facilitamos características de React como memoización
Arquitectura de componentes óptima
Responsabilidad TodoApp(padre)Todo(hijo)Estado Dueño de todosRecibe solo su itemLógica de modificación Define handleUpdateDispara onUpdate()UI/Interacción Lista contenedora Botones/inputs Ventaja clave: Reutilización
El componenteTodoes 100% agnóstico de la lógica de actualización. ¡Podría usarse en otro proyecto con distinta implementación!
🚀 Ejemplo Visual del Flujo
Errores comunes que evita este patrón
Mutación directa del estado
❌ Peligroso:item.title = newTitle(modifica objeto existente)
✅ Seguro:return { ...item, title: newTitle }(nuevo objeto)Lógica duplicada
Al centralizar enTodoApp, evitamos repetir código en cada componente hijo.Acoplamiento excesivo
Todono necesita saber cómo se almacenan las tareas (local storage, API, etc.), solo dispara eventos.
✨ Conclusión: Filosofía React en Acción
handleUpdate es un ejemplo perfecto de:
Flujo unidireccional: Datos bajan, acciones suben
Componentes puros:
Todono modifica estado, solo notificaActualizaciones optimizadas: Inmutabilidad = Comparaciones rápidas
¡Este patrón es la base para gestionar estado en aplicaciones complejas con Redux o Context API

Comentarios
Publicar un comentario