Propsy to dane wejściowe komponentu Reacta. Rodzic przekazuje je jako atrybuty w JSX, <UserCard name="Ada" online={true} />, a dziecko otrzymuje je jako jeden obiekt, który zwykle destrukturyzujesz w parametrach funkcji. Propsy pozwalają jednemu komponentowi pokazywać inne dane za każdym razem, gdy go używasz.
Ten sam UserCard renderuje trzy różne osoby. Zwróć uwagę na ostatnią: atrybut bez wartości, online, oznacza online={true}. Dodaj czwartą kartę z własnym imieniem i rolą.
Przekazywanie i odczytywanie propsów
Tekst przekazuj w cudzysłowie, a każdą inną wartość w nawiasach klamrowych: liczby, wartości logiczne, tablice, obiekty, funkcje, nawet JSX.
<Product
title="Desk lamp"
price={39.5}
inStock={false}
tags={['light', 'office']}
seller={{ name: 'Lumen', rating: 4.8 }}
/>
React zbiera wszystkie atrybuty w jeden obiekt i przekazuje go jako pierwszy argument komponentu. Możesz go odczytać jako props albo rozpakować potrzebne pola od razu w liście parametrów:
function Product(props) {
return <h3>{props.title}</h3>;
}
function Product({ title, price, seller }) {
return <h3>{title}, ${price} from {seller.name}</h3>;
}
Obie wersje dostają ten sam obiekt. Destrukturyzacja to popularny styl, bo sygnatura funkcji wymienia wtedy dokładnie, których propsów komponent używa.
Wartości domyślne
Nadaj propsowi wartość domyślną przez domyślną wartość destrukturyzacji JavaScriptu, = value. Działa ona, gdy rodzic pominie prop albo przekaże undefined. Nie działa dla null, 0, false ani '', które są prawdziwymi wartościami.
Pierwsze trzy przyciski wracają do wartości domyślnych tam, gdzie propsa brakuje albo jest undefined. Ostatni przekazuje null, więc size naprawdę jest null, a wyszukiwanie nie znajduje żadnego paddingu. Zmień size={null} na size="small", żeby to naprawić.
Starszy kod ustawia wartości domyślne przez statyczną właściwość, Button.defaultProps = { size: 'medium' }. React 19 usunął defaultProps dla komponentów funkcyjnych: JSX ignoruje go na funkcji, bez ostrzeżenia. Na komponentach klasowych nadal działa. Używaj wartości domyślnych w destrukturyzacji.
Przekazywanie funkcji jako propsów
Dane płyną w dół: rodzic przekazuje propsy dzieciom, nigdy odwrotnie. Gdy dziecko musi powiedzieć rodzicowi, że coś się stało, rodzic przekazuje funkcję, a dziecko ją wywołuje. Zgodnie z konwencją takie propsy nazywa się onSomething.
Rating niczego nie przechowuje. Pokazuje value, które otrzymuje, i zgłasza kliknięcia przez onRate. Stan znajduje się w App, który przekazuje go z powrotem w dół. Przekaż bezpośrednio onRate={setRating} zamiast handleRate, a nadal będzie działać: setter też jest funkcją. Takie przenoszenie stanu do wspólnego rodzica nazywa się podnoszeniem stanu.
Rozpakowywanie propsów (spread)
Gdy masz już obiekt, którego klucze pasują do propsów komponentu, rozpakuj go przez {...object}, zamiast pisać każdy atrybut. Składnia rest robi odwrotną rzecz w liście parametrów: weź kilka propsów po nazwie, zbierz całą resztę i przekaż ją dalej.
Drugi awatar rozpakowuje person, a potem ustawia color: gdy ten sam prop pojawia się dwa razy, wygrywa późniejszy, więc nadpisania umieszczaj po spreadzie. TextField zatrzymuje label dla siebie i przekazuje type, placeholder i maxLength prosto do <input>. Używaj spreadu w takich opakowaniach; w innych miejscach jawne wypisanie propsów ułatwia zobaczenie, co komponent dostaje.
Propsy są tylko do odczytu
Komponent nigdy nie może zmieniać własnych propsów. Należą one do rodzica, a ten sam obiekt może być współdzielony. Traktuj je jak argumenty funkcji, których nie wolno ci nadpisywać:
function Counter({ count }) {
count = count + 1; // wrong: changes a local copy, the parent never sees it
return <p>{count}</p>;
}
function Profile(props) {
props.name = 'Someone else'; // wrong: in development React freezes props, so this throws a TypeError
return <p>{props.name}</p>;
}
Propsy mimo to zmieniają się w czasie. Gdy rodzic renderuje się ponownie z nowymi wartościami, dziecko dostaje nowy obiekt propsów i renderuje się z nim:
Temperature nigdy nie zmienia celsius. Wylicza z niego fahrenheit przy każdym renderowaniu. Przesuń suwak, a zmieni się stan rodzica, więc dziecko dostanie nowy prop. Jeśli dziecko potrzebuje wartości, którą może zmieniać samo, ta wartość jest stanem, a nie propsem.
Propsy a stan
Propsy i stan to zwykłe wartości JavaScript, które wpływają na to, co renderuje komponent, a zmiana któregokolwiek z nich renderuje komponent ponownie. Różnica polega na tym, kto jest właścicielem wartości.
| Propsy | Stan | |
|---|---|---|
| Pochodzi od | Rodzica, jako atrybuty JSX | Samego komponentu, z useState albo useReducer |
| Czy komponent może go zmienić | Nie, jest tylko do odczytu | Tak, przez swój setter |
| Typowe użycie | Konfiguracja komponentu: etykieta, rozmiar, dane do pokazania | Zapamiętanie czegoś, co się zmienia: tekst w polu, otwarte menu |
Ta sama wartość jest często jednym i drugim. W przykładzie z temperaturą powyżej celsius jest stanem w App i propsem w Temperature. Właściciel trzyma ją jako stan i przekazuje w dół jako prop, razem z funkcją do jej zmiany, gdy dziecko jej potrzebuje.
Prop może przechowywać dowolną wartość, w tym JSX i komponenty. Przekazanie elementu, na przykład icon={<StarIcon />}, pozwala rodzicowi wypełnić miejsce w dziecku; to ten sam pomysł co children, tylko z nazwą, którą sam wybierasz.
Prop children
Cokolwiek umieścisz między tagiem otwierającym i zamykającym komponentu, trafia do niego jako prop o nazwie children. Tak buduje się opakowania, takie jak karty, panele i układy, które nie znają z góry swojej zawartości:
Strona o children omawia przekazywanie kilku slotów i bezpieczną pracę z children.
Klucze to nie propsy
key wygląda jak atrybut, ale React zatrzymuje go dla siebie, żeby dopasowywać elementy listy między renderowaniami. Komponent nigdy go nie dostaje:
Konsola pokazuje props.key jako undefined, a props.id z prawdziwą wartością. Gdy dziecko potrzebuje identyfikatora, przekaż go drugi raz pod inną nazwą, tak jak robi to tutaj id. Build deweloperski ostrzega też, gdy odczytujesz props.key; podgląd działa jak build produkcyjny, więc widzisz tylko undefined.
Najczęściej zadawane pytania
Co to są propsy w React?
Propsy (skrót od properties, czyli właściwości) to argumenty komponentu. Rodzic przekazuje je jako atrybuty JSX, <Avatar size={48} />, a dziecko otrzymuje je jako jeden obiekt, zwykle destrukturyzowany: function Avatar({ size }).
Jak ustawić wartość domyślną propsa?
Użyj wartości domyślnej w destrukturyzacji: function Button({ size = 'medium' }). Wartość domyślna działa, gdy prop nie został podany albo ma wartość undefined. React 19 usunął defaultProps dla komponentów funkcyjnych; komponenty klasowe nadal go obsługują.
Czy komponent dziecka może zmienić swoje propsy?
Nie. Propsy są tylko do odczytu. Żeby zmienić to, co pokazuje dziecko, rodzic przekazuje nowe propsy; żeby dziecko mogło poprosić o zmianę, rodzic przekazuje funkcję, na przykład onChange, a dziecko ją wywołuje.
Czym różnią się propsy od stanu?
Propsy pochodzą od rodzica i dziecko nie może ich zmienić. Stan należy do samego komponentu i zmienia się przez jego setter. Ta sama wartość jest często stanem w rodzicu i propsem w jego dzieciach.
Dlaczego props.key ma wartość undefined?
key (podobnie jak ref w starszym Reakcie) jest używany przez sam React do śledzenia elementów listy i nie jest przekazywany do komponentu. Jeśli dziecko potrzebuje tej wartości, przekaż ją ponownie pod inną nazwą, na przykład <Row key={id} id={id} />.