Listas e chaves
Imagine que você está construindo uma lista de tarefas: alguns itens, cada um com seu próprio texto, extraídos de um array de objetos todo. React não tem um componente especial 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 uma prop passada por um componente pai que possui os dados reais. todos.map percorre o array e retorna um <li> para cada todo. As chaves em volta dele colocam esse array de elementos JSX direto no <ul>, da mesma forma que você colocaria uma única expressão. Cada <li> também recebe uma prop key, definida como todo.id. Essa parte não é opcional se você quer que a lista se comporte corretamente: se pular isso, React ainda renderiza a lista, mas registra um aviso no console, e os bugs de reordenação descritos abaixo se tornam riscos reais na primeira vez que a lista mudar de forma.
Uma chave é como React diferencia os itens da lista de uma renderização para a próxima. Ela precisa ser única entre seus irmãos, para que nenhum dos dois elementos <li> nessa lista compartilhem uma chave, e precisa ser estável, o que significa que o mesmo todo recebe a mesma chave sempre que a lista é renderizada novamente. Um id dos seus dados, como todo.id, é exatamente isso: pertence ao todo, não à sua posição no array, então permanece no lugar mesmo se a lista ao redor mudar.
Por que o índice do array é uma chave ruim
É por isso que o índice do array é uma chave ruim. É tentador, 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 acontecer, o índice para de apontar para o item ao qual costumava apontar. 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 tiver seu próprio state, como uma checkbox em edição ou um input que alguém está digitando, esse state permanece anexado ao índice e acaba na linha errada. Trate o índice como um fallback para listas que são estáticas e nunca são reordenadas. Use um id real em todos os outros lugares.
map, dê a cada um uma key, e use um id real dos 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.
A seguir: State, onde um componente começa a lembrar de coisas entre renderizações.

