Menu

Propsy w React: przekazywanie danych do komponentów

Propsy to dane wejściowe komponentu Reacta: wartości, które rodzic przekazuje dziecku jako atrybuty JSX. Dowiedz się, jak przekazywać i destrukturyzować propsy, ustawiać wartości domyślne, przekazywać funkcje, rozpakowywać propsy i dlaczego są tylko do odczytu.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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.

PropsyStan
Pochodzi odRodzica, jako atrybuty JSXSamego komponentu, z useState albo useReducer
Czy komponent może go zmienićNie, jest tylko do odczytuTak, przez swój setter
Typowe użycieKonfiguracja komponentu: etykieta, rozmiar, dane do pokazaniaZapamię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} />.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ