Listas y keys
Imagina que estás construyendo una lista de tareas: varios elementos, cada uno con su propio texto, sacados de un array de objetos todo. React no tiene un componente especial para convertir ese array en markup. Usas el map de JavaScript para convertir cada elemento en un pedazo 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 una prop pasada desde un componente padre que es dueño de los datos reales. todos.map recorre el array y devuelve un <li> para cada todo. Las llaves alrededor lo sueltan directamente en el <ul>, igual que soltarías una sola expresión. Cada <li> también recibe una prop key, establecida a todo.id. Esa parte no es opcional si quieres que la lista funcione correctamente: omítela, y React igual renderiza la lista, pero registra una advertencia en la consola, y los bugs de reorden que se describen abajo se vuelven riesgos reales la primera vez que la lista cambia de forma.
Una key 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 <li> en esta lista comparten una key, y tiene que ser estable, lo que significa que el mismo todo obtiene la misma key cada vez que la lista se rerenderiza. 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 a su alrededor cambia.
Por qué el índice del array es una mala key
Ese último punto es por qué el índice del array es una mala key. 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 haya 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 sube un índice, así que React ve las mismas keys adjuntas a diferentes todos. Si alguno de esos elementos de la lista sostiene su propio estado, como un checkbox a mitad de una edición o un input en el que alguien está escribiendo, ese estado permanece adjunto al índice y termina en la fila equivocada. Trata el índice como un respaldo para listas estáticas que nunca se reordenan. Usa una key real en cualquier otro lugar.
map, dale a cada uno una key, y usa un id real de tus datos, no su posición en el array. La key es cómo React mantiene un registro de cuál es cuál entre renderizados, y un id que pertenece al elemento se mantiene correcto incluso si la lista se reordena. Lo siguiente: Estado, donde un componente comienza a recordar cosas entre renderizados.

