3-Renderiza tu Lista de Tareas
Cómo React Renderiza tu Lista de Tareas: Una Explicación Detallada
En este post, vamos a profundizar en cómo React renderiza dinámicamente la lista de tareas en nuestra aplicación. Esta es una parte fundamental para entender el flujo de datos y la reactividad en React.
El Mecanismo de Renderizado
En nuestro componente TodoApp, la lista de tareas se renderiza mediante este código:
<div className="todosContainer">
{todos.map((item) => (
<Todo
key={item.id}
item={item}
onUpdate={handleUpdate}
onDelete={handleDelete}
onComplete={handleCheckboxChange}
/>
))}
</div>Paso a Paso del Proceso
1. El Array de Tareas (todos)
Nuestro estado todos es un array que contiene objetos con esta estructura:
{
id: 123456789, // Identificador único
title: "Ir al médico", // Texto de la tarea
completed: false // Estado de completado
}2. El Método .map()
El método map() es clave en este proceso:
Itera sobre cada elemento del array
todosPara cada tarea (
item), retorna un componente<Todo>Transforma nuestro array de datos en un array de componentes React
todos.map((item) => ( /* retorna componente Todo */ ))3. El Componente <Todo>
Para cada tarea, creamos una instancia del componente <Todo> con estas props:
<Todo
key={item.id} // Identificador único para React
item={item} // El objeto completo de la tarea
onUpdate={handleUpdate} // Función para editar
onDelete={handleDelete} // Función para eliminar
onComplete={handleCheckboxChange} // Función para marcar como completado
/>4. La Propiedad key
La prop key es crucial para el rendimiento:
Ayuda a React identificar qué items han cambiado
Debe ser un valor único y estable (usamos
item.id)Nunca usar el índice del array como key (puede causar problemas)
key={item.id} // Correcto - ID único
key={index} // ❌ Evitar - No es estable5. Re-renderizado Automático
La magia de React entra en juego aquí:
Cuando
todoscambia (añadir/editar/eliminar)React detecta el cambio de estado
Vuelve a ejecutar el
map()con los nuevos datosCompara las keys para saber qué actualizar
Renderiza sólo los componentes afectados (no toda la lista)
El Componente Todo Interno
Dentro de Todo.js, recibimos las props y renderizamos cada tarea:
export default function Todo({ item, onUpdate, onDelete }) {
const [isEditing, setIsEditing] = useState(false);
return (
<div className="todo">
{isEditing ? (
/* Formulario de edición */
) : (
/* Vista normal de la tarea */
<>
<span>{item.title}</span>
<button onClick={() => setIsEditing(true)}>Editar</button>
<button onClick={() => onDelete(item.id)}>Eliminar</button>
</>
)}
</div>
);
}Flujo Completo de Renderizado
Estado inicial:
todoses un array vacío → No se renderizan tareasAgregar tarea:
User escribe en input y envía formulario
handleSubmitagrega nueva tarea atodosReact detecta cambio de estado
Re-ejecuta el
map()que ahora tiene un elementoRenderiza un nuevo componente
<Todo>
Editar/Eliminar:
Las funciones
onUpdateyonDeletemodificantodosReact vuelve a renderizar sólo los componentes afectados
Buenas Prácticas
Componentes pequeños: Cada
<Todo>es independienteListas eficientes: Usar
keyúnica para optimizar rendersElevación de estado: El estado principal está en el componente padre
Props claras: Pasamos sólo los datos y handlers necesarios
Ejemplo Visual
Si tenemos estas tareas:
[
{id: 1, title: "Comprar leche", completed: false},
{id: 2, title: "Llamar al médico", completed: true}
]React transformará esto en:
<div className="todosContainer">
<Todo key={1} item={/* objeto 1 */} ... />
<Todo key={2} item={/* objeto 2 */} ... />
</div>Conclusión
El renderizado de listas en React combina:
La potencia de JavaScript (
map)El sistema reactivo de actualizaciones
La eficiencia del Virtual DOM
Entender este flujo es fundamental para construir aplicaciones React sólidas y eficientes. En próximos posts exploraremos cómo optimizar listas grandes y añadir más funcionalidades.
Comentarios
Publicar un comentario