Listas e chaves
Imagina que você está construindo uma lista de tarefas: alguns itens, cada um com seu próprio texto, vindos de um array de objetos todo. React não tem um componente especial de lista para transformar esse array em markup. Você usa o map do JavaScript puro para transformar cada item em um pedaço de JSX, e React renderiza o resultado.
function TodoList({ todos }) {
return (
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
)
}Renderizando uma lista com map
Esse array todos geralmente chega como um prop passado de um componente pai que dono dos dados de verdade. todos.map percorre o array e retorna um <li> para cada todo. As chaves (curly braces) ao redor dele colocam esse array de elementos JSX direto dentro de <ul>, do mesmo jeito que você colocaria uma única expressão. Cada <li> também recebe um prop key, definido como todo.id. Essa parte não é opcional se você quer que a lista funcione corretamente: se pular isso, React ainda renderiza a lista, mas loga um aviso no console, e os bugs de reordenação descritos abaixo se tornam riscos reais na primeira vez que a lista muda de forma.
Uma chave é como React diferencia itens de lista de uma renderização para a próxima. Ela tem que ser única entre seus irmãos, então nenhuns dois <li> nessa lista compartilham uma chave, e tem que ser estável, significando que o mesmo todo sempre recebe a mesma chave toda vez que a lista é renderizada novamente. Um id vindo de seus dados, como todo.id, é exatamente isso: ele pertence ao todo, não à sua posição no array, então permanece no lugar mesmo se a lista ao redor muda.
Por que o índice do array é uma péssima chave
É por isso que o índice do array é uma péssima chave. É tentador usar, já que todo array já tem um:
{todos.map((todo, index) => (
<li key={index}>{todo.text}</li>
))}Isso funciona bem enquanto a lista nunca for reordenada, e nunca tiver itens inseridos ou deletados. No momento em que isso acontece, o índice para de corresponder ao item para o qual apontava. Delete o primeiro todo e cada item restante sobe um índice, então React vê as mesmas chaves anexadas a todos diferentes. Se algum desses itens da lista mantém seu próprio estado, como uma checkbox no meio de uma edição ou um input no qual alguém está digitando, esse estado fica anexado ao índice e acaba na linha errada. Trate o índice como um fallback para listas estáticas que nunca são reordenadas. Use um id real em qualquer outro lugar.
map, dê a cada um uma key, e use um id real de seus dados, não sua posição no array. A chave é como React acompanha qual elemento é qual entre renderizações, e um id que pertence ao item permanece correto mesmo se a lista for reordenada. Próximo: Estado, onde um componente começa a lembrar das coisas entre renderizações.

