Listas y claves
Supongamos que estás construyendo una lista de tareas: algunos elementos, cada uno con su propio texto, extraídos de un array de objetos todo. React no tiene un componente especial de lista para convertir ese array en markup. Usas el map de JavaScript puro para convertir cada elemento en un fragmento de JSX, y React renderiza los resultados.
function TodoList({ todos }) {
return (
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
)
}Renderizar una lista con map
Ese array todos generalmente llega como un prop pasado desde un componente padre que posee los datos reales. todos.map recorre el array y devuelve un <li> para cada todo. Las llaves alrededor de él colocan ese array de elementos JSX directamente en el <ul>, de la misma manera que colocarías una sola expresión. Cada <li> también recibe un prop key, establecido en todo.id. Esa parte no es opcional si quieres que la lista se comporte correctamente: si la omites, React sigue renderizando la lista, pero registra una advertencia en la consola, y los bugs de reordenamiento descritos a continuación se vuelven riesgos reales la primera vez que la lista cambia de forma.
Una clave es cómo React distingue los elementos de una lista de un renderizado al siguiente. Tiene que ser única entre sus hermanos, así que ningos dos elementos <li> en esta lista comparten una clave, y tiene que ser estable, lo que significa que el mismo todo obtiene la misma clave cada vez que la lista se renderiza de nuevo. Un id de tus datos, como todo.id, es exactamente eso: pertenece al todo, no a su posición en el array, así que se mantiene en su lugar incluso si la lista alrededor cambia.
Por qué el índice del array es una mala clave
Ese último punto es por qué el índice del array es una mala clave. Es tentador, ya que cada array ya tiene uno:
{todos.map((todo, index) => (
<li key={index}>{todo.text}</li>
))}Esto funciona bien mientras la lista nunca se reordene, y nunca tenga elementos insertados o eliminados. En el momento en que lo hace, el índice deja de coincidir con el elemento al que solía apuntar. Elimina el primer todo y cada elemento restante se desplaza un índice hacia arriba, así que React ve las mismas claves adjuntas a diferentes todos. Si alguno de esos elementos de la lista mantiene su propio estado, como un checkbox a mitad de edición o un input donde alguien está escribiendo, ese estado se mantiene adjunto al índice y termina en la fila incorrecta. Trata el índice como un respaldo para listas que son estáticas y nunca se reordenan. Usa un id real en todos los demás casos.
map, dale a cada uno una key, y usa un id real de tus datos, no su posición en el array. La clave es cómo React mantiene un registro de cuál elemento es cuál entre renderizados, y un id que pertenece al elemento se mantiene correcto incluso si la lista se reordena.
Siguiente: Estado, donde un componente comienza a recordar cosas entre renderizados.

