Listas y Keys
Renderizar listas de datos y entender las keys
Renderizando Listas
En React, usas el metodo map() de JavaScript para transformar arrays de datos en arrays de elementos JSX.
Ejemplo Basico de Lista
function ListaFrutas() {
const frutas = ['Manzana', 'Banana', 'Cereza', 'Durazno'];
return (
<ul>
{frutas.map((fruta, indice) => (
<li key={indice}>{fruta}</li>
))}
</ul>
);
}
Por que las Keys son Importantes
Las keys ayudan a React a identificar que items han cambiado, sido agregados o eliminados. Deben ser unicas entre hermanos.
// Bueno - usando IDs unicos
const usuarios = [
{ id: 1, nombre: 'Ana' },
{ id: 2, nombre: 'Juan' },
{ id: 3, nombre: 'Maria' }
];
function ListaUsuarios() {
return (
<ul>
{usuarios.map(usuario => (
<li key={usuario.id}>{usuario.nombre}</li>
))}
</ul>
);
}
// Evitar - usar indice como key cuando la lista puede cambiar
// Solo es seguro si la lista es estatica y nunca se reordena
Renderizando Objetos Complejos
function ListaProductos() {
const productos = [
{ id: 'p1', nombre: 'Laptop', precio: 999, enStock: true },
{ id: 'p2', nombre: 'Telefono', precio: 699, enStock: false },
{ id: 'p3', nombre: 'Tablet', precio: 499, enStock: true }
];
return (
<div className="grid">
{productos.map(producto => (
<div key={producto.id} className="tarjeta-producto">
<h3>{producto.nombre}</h3>
<p>Precio: ${producto.precio}</p>
<p>{producto.enStock ? 'En Stock' : 'Agotado'}</p>
</div>
))}
</div>
);
}
Extrayendo Componentes de Lista
// Componente de item individual
function ItemProducto({ producto }) {
return (
<div className="tarjeta-producto">
<h3>{producto.nombre}</h3>
<p>Precio: ${producto.precio}</p>
</div>
);
}
// Componente de lista
function ListaProductos({ productos }) {
return (
<div className="grid">
{productos.map(producto => (
<ItemProducto key={producto.id} producto={producto} />
))}
</div>
);
}
Filtrando y Mapeando
function ListaTareas({ tareas }) {
const tareasPendientes = tareas.filter(t => !t.completada);
const tareasCompletadas = tareas.filter(t => t.completada);
return (
<div>
<h2>Pendientes ({tareasPendientes.length})</h2>
<ul>
{tareasPendientes.map(tarea => (
<li key={tarea.id}>{tarea.texto}</li>
))}
</ul>
<h2>Completadas ({tareasCompletadas.length})</h2>
<ul>
{tareasCompletadas.map(tarea => (
<li key={tarea.id} style={{ textDecoration: 'line-through' }}>
{tarea.texto}
</li>
))}
</ul>
</div>
);
}
Reglas de las Keys
- Unicas entre hermanos: No necesitan ser globalmente unicas
- Estables: No deben cambiar entre renderizados
- No usar indices: Si los items pueden reordenarse, agregarse o eliminarse
- Usar IDs: Si los datos tienen IDs unicos, usalos