CodeForge

React 19 de Cero a Experto / Fundamentos

Listas y keys: renderizar arrays de datos

Teoría20 min20 XP

Tus datos casi nunca vienen de uno en uno: son LISTAS —un array de gastos, de usuarios, de mensajes—. Renderizarlas en React es tan simple como un .map() que devuelve JSX, con un detalle que confunde a todos al principio: la prop key. Hoy dominas el patrón que usarás en literalmente cada app de React.

De array a UI, con map

El patrón: map dentro de JSX

Dentro de {}, un .map() que devuelve JSX por cada elemento renderiza la lista completa:

El {gastos.map((g) => <li key={g.id}>...</li>)} recorre el array y produce un <li> por gasto —React pinta todos—. Es tu .map() de siempre, devolviendo JSX en vez de valores. Fíjate en el key={g.id}: esa prop especial es la que hace que todo funcione bien, y es la que más se malentiende.

La prop key: la identidad de cada elemento

La trampa del índice como key

El error más común: usar el índice del array como key. Funciona… hasta que la lista cambia de orden o se borra un elemento del medio:

key-indice.tsx
// ❌ el índice como key: frágil si la lista se reordena o se borran items
{gastos.map((g, indice) => (
<li key={indice}>{g.nombre}</li>
))}
// problema: si borras el gasto 0, el que era índice 1 pasa a ser índice 0,
// y React cree que es "el mismo" elemento que cambió de contenido → bugs de
// estado, inputs que conservan valores equivocados, animaciones cruzadas.

// ✅ una key ESTABLE que viaja con el dato (su id):
{gastos.map((g) => (
<li key={g.id}>{g.nombre}</li>
))}

La regla: usa un ID ESTABLE que pertenezca al dato (g.id), no el índice. El índice cambia cuando la lista se reordena o se borra algo del medio, y entonces React empareja mal los elementos —causando bugs sutiles con el estado y los inputs—. Si tus datos no tienen id, genera uno al crearlos (como el Date.now() del SC-02). Solo usa el índice si la lista es ESTÁTICA y nunca cambia de orden.

Renderizas una lista de tareas con key={indice}. Al borrar la primera tarea, notas que un input de otra tarea conserva el texto equivocado. ¿Cuál es la causa?

Mini-reto

Renderiza datos reales: 1) crea un array de objetos usuario con id, nombre y edad; 2) renderízalos con .map() en una lista, usando key={usuario.id} y un componente <TarjetaUsuario> por cada uno (props tipadas); 3) agrega debajo un <p> con el promedio de edad calculado con reduce. Practica el flujo array → UI que usarás sin parar.

Qué sigue

Tu UI ya muestra listas de datos. Pero una interfaz sin interacción es un póster. La próxima lección le da vida: los EVENTOS —clics, cambios en inputs— y cómo un componente responde a ellos y avisa hacia arriba. El principio de las apps que reaccionan al usuario.