0Pricing
React Academy · Lekcja

Dobre praktyki dotyczące key i ref

Używaj stabilnych kluczy, unikaj problemów z indeksem jako kluczem i pracuj z refami zwrotnymi

Dobre praktyki dotyczące key i ref to bezpłatna lekcja React Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Wprowadzenie

W tej lekcji dowiedzą się Państwo, jak prawidłowo używać kluczy elementów listy, dlaczego używanie indeksu tablicy jako klucza powoduje błędy oraz jak pracować z refami zwrotnymi i przekazywanymi dalej.

Dlaczego klucze mają znaczenie

React używa propsów `key` do śledzenia elementów listy, które zmieniły się, zostały dodane lub usunięte między renderowaniami. Prawidłowy klucz pozwala React ponownie wykorzystać istniejące węzły DOM; nieprawidłowy klucz powoduje niepotrzebne odmontowania i ponowne montowania.

Stabilne, unikalne klucze

Najlepszym kluczem jest stabilny, unikalny identyfikator z danych — na przykład identyfikator wiersza w bazie danych lub UUID. Klucz musi być unikalny tylko wśród elementów rodzeństwa, a nie globalnie na całej stronie.
users.map(user => (
  <UserCard key={user.id} user={user} />
))

Dlaczego indeks jako klucz jest problematyczny

Używanie indeksu tablicy jako klucza działa poprawnie w przypadku statycznych list, ale powoduje błędy na listach sortowanych lub filtrowanych. Gdy elementy zmieniają kolejność, React dopasowuje komponenty według indeksu i ponownie wykorzystuje niewłaściwe węzły DOM, co prowadzi do uszkodzenia wartości pól wejściowych i stanu animacji.
// Risky when list can reorder or filter
items.map((item, i) => <Row key={i} {...item} />)

Kiedy indeks jako klucz jest dopuszczalny

Indeks jako klucz jest dopuszczalny tylko wtedy, gdy: (1) lista nigdy nie zmienia kolejności ani nie jest filtrowana, (2) elementy nie mają stabilnych identyfikatorów oraz (3) elementy nie mają lokalnego stanu (np. wartości pól wejściowych). Statyczne listy prezentacyjne są odpowiednie.

Generowanie stabilnych identyfikatorów

Jeśli dane nie mają identyfikatora, należy wygenerować go w momencie tworzenia elementu (a nie podczas renderowania). Można użyć `crypto.randomUUID()` lub biblioteki `nanoid`.
const newItem = { id: crypto.randomUUID(), text: 'Buy milk' };

Podstawy useRef

`useRef` zwraca mutowalny obiekt, którego wartość `.current` jest zachowywana między renderowaniami bez powodowania ponownych renderowań. Służy on do przechowywania referencji do DOM oraz zmiennych wartości, takich jak identyfikatory timerów.
const inputRef = useRef(null);
<input ref={inputRef} />
// Access DOM node: inputRef.current.focus();

Refy zwrotne

Zamiast przekazywać obiekt ref można przekazać **ref zwrotny** — funkcję, którą React wywołuje z węzłem DOM podczas jego montowania oraz z wartością `null` podczas odmontowywania. Pozwala to skonfigurować logikę dokładnie w momencie, gdy węzeł staje się dostępny.
function Input() {
  return (
    <input
      ref={node => {
        if (node) node.focus();
      }}
    />
  );
}

forwardRef dla refów komponentów

Komponenty funkcyjne nie przyjmują `ref` jako zwykłego propsa. Należy opakować komponent w `React.forwardRef`, aby komponent nadrzędny mógł dołączyć ref do wewnętrznego węzła DOM.
const FancyInput = React.forwardRef((props, ref) => (
  <input ref={ref} className="fancy" {...props} />
));

// Parent
const inputRef = useRef(null);
<FancyInput ref={inputRef} />

useImperativeHandle

Gdy komponent nadrzędny przechowuje ref do komponentu potomnego, można dokładnie określić, co ten komponent udostępnia, za pomocą `useImperativeHandle`. Pozwala to zachować wewnętrzny DOM komponentu potomnego jako prywatny i udostępnić przejrzyste imperatywne API.
const Child = forwardRef((_, ref) => {
  const innerRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => innerRef.current.focus(),
  }));
  return <input ref={innerRef} />;
});

Szybkie sprawdzenie

Dlaczego należy unikać używania indeksu tablicy jako klucza na liście, której kolejność może się zmieniać?

Podsumowanie

Należy używać identyfikatorów danych jako stabilnych kluczy, unikać indeksów jako kluczy na dynamicznych listach, używać useRef do dostępu do DOM i przechowywania zmiennych wartości, używać refów zwrotnych do obsługi montowania i odmontowywania oraz używać forwardRef do udostępniania refów z komponentów potomnych.

Następna lekcja

Następna lekcja: **Struktura folderów i konwencje nazewnictwa** — dowiedzą się Państwo, jak organizować projekt React z folderami opartymi na funkcjach oraz spójnym nazewnictwem plików.

Często zadawane pytania

Czy lekcja „Dobre praktyki dotyczące key i ref” jest bezpłatna?

Tak — pełny tekst „Dobre praktyki dotyczące key i ref” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Dobre praktyki dotyczące key i ref”?

Używaj stabilnych kluczy, unikaj problemów z indeksem jako kluczem i pracuj z refami zwrotnymi Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Dobre praktyki dotyczące key i ref”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Działanie StrictMode
  2. Czyste komponenty i unikanie efektów ubocznych podczas renderowania
  3. Dobre praktyki dotyczące key i ref
  4. Struktura folderów i konwencje nazewnictwa
← Powrót do React Academy