0Pricing
React Academy · Lekcja

forwardRef: udostępnianie ref DOM komponentom nadrzędnym

Proszę poznać sposób, w jaki forwardRef umożliwia komponentom nadrzędnym dostęp do węzła DOM lub instancji komponentu podrzędnego.

forwardRef: udostępnianie ref DOM komponentom nadrzędnym to bezpłatna lekcja React Academy na CoddyKit. To lekcja 1 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.

Czym są ref i jakie jest ich domyślne ograniczenie

Ref to sposób na przechowywanie odwołania do węzła DOM lub instancji komponentu, które zachowuje się między renderowaniami bez wywoływania ponownego renderowania. Ref przypisuje się za pomocą atrybutu ref, a React wypełnia jego właściwość current po zatwierdzeniu zmian w DOM.

Problem polega na tym, że ref nie można przypisać do komponentu funkcyjnego tak jak do elementu div. Domyślnie rodzic nie ma dostępu do węzła DOM znajdującego się wewnątrz komponentu potomnego, ponieważ ref nie są przekazywane tak jak zwykłe props.

forwardRef opakowuje komponent

React.forwardRef pozwala komponentowi otrzymać ref od rodzica i przekazać go dalej do jednego z własnych elementów. Opakowuje funkcję komponentu i zmienia jej sygnaturę, tak aby ref docierał jako drugi argument, obok props.

Jest to oficjalny mechanizm umożliwiający udostępnienie wewnętrznego węzła DOM komponentowi wywołującemu, zmieniając w innym przypadku nieprzezroczysty komponent potomny w taki, którego element rodzic może bezpośrednio wskazać.

Sygnatura forwardRef

Opakowana funkcja przyjmuje dwa parametry: (props, ref). Pierwszym jest zwykły obiekt props, a drugim przekazany ref. Następnie należy rozwinąć ten ref lub przypisać go do elementu, który ma zostać udostępniony, na przykład ref={ref} do wewnętrznego inputu.

Należy pamiętać, że tylko komponenty opakowane za pomocą forwardRef otrzymują ten drugi argument. Zwykły komponent funkcyjny, którego drugi parametr nazywa się ref, otrzyma po prostu undefined.

Przypadek użycia: ustawianie fokusu na polu potomnym z poziomu rodzica

Klasycznym przykładem jest wielokrotnego użytku komponent pola tekstowego, którego wewnętrzne pole input ma zostać uaktywnione przez rodzica. Opakowanie pola w forwardRef i przypisanie przekazanego ref do bazowego elementu input pozwala rodzicowi bezpośrednio wywołać na nim focus.

Dzięki temu komponent pola pozostaje wielokrotnego użytku, a jednocześnie zapewnia kontrolowany imperatywny dostęp dokładnie tam, gdzie jest on potrzebny, na przykład do ustawienia fokusu na pierwszym polu formularza podczas montowania.

Mierzenie elementu potomnego

Przekazywane ref umożliwiają również pomiar. Rodzic może odczytać offsetWidth i offsetHeight albo wywołać getBoundingClientRect na elemencie potomnym otrzymanym za pośrednictwem forwardRef.

Jest to przydatne w przypadku tooltipów, popoverów i obliczeń układu, gdy rodzic musi znać dokładny rozmiar lub położenie wyrenderowanego elementu wewnętrznego, zanim zdecyduje, jak umieścić względem niego inny element.

Wywoływanie metod przewijania

Ponieważ przekazany ref wskazuje rzeczywisty węzeł DOM, rodzic może wywoływać na nim natywne metody DOM. Wywołanie scrollIntoView na przekazanym elemencie listy płynnie przewija widok do tego elementu, a scrollTo na przekazanym kontenerze przewijania zmienia położenie jego zawartości.

Są to działania imperatywne, które nie mają prostego deklaratywnego odpowiednika — dokładnie do obsługi takich interakcji przeznaczone są ref.

Przekazywanie ref przez wiele warstw

Czasami element, który ma zostać udostępniony, jest ukryty kilka komponentów głębiej. Można łączyć forwardRef, aby każda warstwa pośrednia przekazywała otrzymany ref do kolejnej, aż ostatecznie trafi on do docelowego węzła DOM.

Każdy wrapper w tym łańcuchu musi sam używać forwardRef i przekazywać ref dalej, ponieważ zwykły komponent umieszczony pośrodku przerwałby to połączenie.

Kompozycja forwardRef + memo

forwardRef i React.memo można połączyć, aby uzyskać zarówno przekazywanie ref, jak i zapamiętywanie renderowania. Zwykle stosuje się kolejność memo(forwardRef(Component)), opakowując wynik forwardRef, aby porównanie memo nadal obowiązywało.

Ten wzorzec pojawia się w systemach projektowych wrażliwych na wydajność, w których często renderowany komponent musi zarówno udostępniać swój węzeł, jak i pomijać zbędne ponowne renderowania.

Wyświetlanie forwardRef w DevTools

W React DevTools komponent forwardRef jest wyświetlany z etykietą ForwardRef opakowującą nazwę komponentu. Dzięki temu można szybko potwierdzić, że komponent uczestniczy w przekazywaniu ref.

Aby wpis w DevTools był czytelniejszy niż ogólna etykieta anonimowego ForwardRef, można nadać nazwę funkcji wewnętrznej lub ustawić displayName.

Kiedy NIE używać forwardRef

forwardRef służy do udostępniania węzłów DOM i uchwytów imperatywnych, a nie do przekazywania danych. Jeśli rodzic musi wpływać na komponent potomny, należy preferować zwykłe props i state zamiast uzyskiwania dostępu przez ref.

Nadużywanie ref silnie wiąże komponenty i omija przepływ danych React, przez co trudniej zrozumieć działanie aplikacji. Po forwardRef należy sięgać tylko wtedy, gdy deklaratywne props rzeczywiście nie pozwalają wyrazić danej interakcji.

forwardRef we współczesnym React

forwardRef pozostaje standardowym narzędziem do udostępniania ref w bibliotekach komponentów i wielokrotnego użytku polach input. Nowsze wersje React zmierzają w kierunku przekazywania ref jako zwykłego props, ale forwardRef nadal jest powszechnie używany i ważny do zrozumienia.

Dobra znajomość tego mechanizmu przygotowuje zarówno do pracy z istniejącymi bazami kodu, jak i do zrozumienia podstawowych mechanizmów, na których będzie opierać się każda przyszła składnia ref-as-prop.

Szybki test: sygnatura forwardRef

Sprawdź, jak dobrze rozumiesz sposób, w jaki komponent forwardRef otrzymuje ref.

Podsumowanie: forwardRef

forwardRef rozwiązuje ograniczenie polegające na tym, że rodzic nie może dotrzeć do węzła DOM komponentu potomnego, przekazując komponentowi drugi argument ref, który można przypisać do wewnętrznego elementu. Umożliwia to ustawianie fokusu, mierzenie i przewijanie elementów potomnych.

forwardRef można łączyć z memo i przekazywać przez kolejne warstwy; w DevTools jest wyświetlany jako ForwardRef. Należy używać go do imperatywnego dostępu do DOM, a nie do przekazywania danych, do czego lepiej nadają się props.

Często zadawane pytania

Czy lekcja „forwardRef: udostępnianie ref DOM komponentom nadrzędnym” jest bezpłatna?

Tak — pełny tekst „forwardRef: udostępnianie ref DOM komponentom nadrzędnym” 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 „forwardRef: udostępnianie ref DOM komponentom nadrzędnym”?

Proszę poznać sposób, w jaki forwardRef umożliwia komponentom nadrzędnym dostęp do węzła DOM lub instancji komponentu podrzędnego. Ć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 1 z 4.

Ile czasu zajmuje lekcja „forwardRef: udostępnianie ref DOM komponentom nadrzędnym”?

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. forwardRef: udostępnianie ref DOM komponentom nadrzędnym
  2. useImperativeHandle: niestandardowe wartości instancji
  3. Budowanie imperatywnego API komponentu
  4. Kiedy używać API imperatywnych, a kiedy deklaratywnych
← Powrót do React Academy