Klíče

React ukáže seznam a pak se data změní: na začátek přibude kapela, jiná koncert zruší, seznam se seřadí. React pak nevytváří celý seznam na stránce znovu. Porovná nový seznam s tím, který je na stránce, a změní jen to, co je jinak. K tomu ale potřebuje vědět, která položka je která: je druhá položka pořád ta samá kapela jako předtím, nebo nová?

K tomu slouží klíč: jméno každé položky, podle kterého ji React pozná. Napíšete ho do atributu key prvku, který vrací map():

const podia = [
    { id: 1, nazev: "Hlavní pódium" },
    { id: 2, nazev: "Stan" },
    { id: 3, nazev: "Lesní scéna" },
];

export default function App() {
    return (
        <ul>
            {podia.map((podium) => (
                <li key={podium.id}>{podium.nazev}</li>
            ))}
        </ul>
    );
}

Díky klíči React ví, že položka s klíčem 3 je Lesní scéna, ať je v seznamu kdekoli. A varování z minulého cvičení zmizí.

Pravidla pro klíče:

  • Klíč musí být jedinečný mezi položkami jednoho seznamu. (Dva různé seznamy můžou mít stejné klíče.)
  • Pro tutéž položku musí zůstat stejný. Vezměte ho z dat, obvykle je to její id. I proto mají data ze serverů a databází id. Když jsou položky texty, které se neopakují, může být klíčem přímo text: key={nazev}.
  • Klíč se na stránce neukáže a do props nepatří: komponenta ho přečíst nemůže.

Proč ne pozice v poli? map() dává své funkci pozici jako druhý argument a s key={index} varování taky zmizí. Jenže když přibude kapela na začátek, posune se každá další o pozici dál a dostane nový klíč. React si pak myslí, že první položka je pořád ta, kterou znal, a položky si splete. Vadí to, jakmile si položky něco pamatují (to přijde v lekci Stav): lajky jedné kapely by pak připadly jiné. Klíče z id se se změnou pořadí nemění.

Pokyny

Dejte každému li klíč: id kapely. Spusťte kód: varování v konzoli zmizí.

Před každým názvem ukažte čas, třeba 20:00 Noční vlaky.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

Zpět

2/11

Další