0Pricing
React Academy · Lekcja

useImperativeHandle: niestandardowe wartości instancji

Proszę używać useImperativeHandle do precyzyjnego kontrolowania tego, co widzi komponent nadrzędny przechowujący ref do Państwa komponentu.

useImperativeHandle: niestandardowe wartości instancji to bezpłatna lekcja React Academy na CoddyKit. To lekcja 2 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.

Domyślnie przekazywany ref

Gdy ref jest przekazywany bezpośrednio do elementu DOM, rodzic otrzymuje surowy węzeł DOM i uzyskuje dostęp do wszystkich jego natywnych metod i właściwości. Jest to często większy zakres dostępu, niż chcemy udostępniać.

Czasami lepiej przekazać rodzicowi niewielki, starannie dobrany obiekt zamiast całego węzła DOM, celowo ograniczając publiczne API komponentu.

useImperativeHandle zastępuje wartość ref

useImperativeHandle pozwala dostosować wartość, na którą wskazuje ref rodzica. Zamiast węzła DOM rodzic otrzymuje dowolny zwrócony obiekt, dzięki czemu można dokładnie określić, które metody i wartości zostaną udostępnione.

W ten sposób przekazany ref staje się zdefiniowanym interfejsem imperatywnym, a nie niekontrolowanym przekazaniem dostępu do bazowego elementu.

Sygnatura hooka

Hook przyjmuje przekazany ref jako pierwszy argument oraz funkcję fabrykującą jako drugi. Fabryka zwraca obiekt uchwytu, który staje się wartością ref.current u rodzica.

Wywołuje się go jako useImperativeHandle(ref, () => ({ ... })), budując wewnątrz fabryki obiekt metod i wartości, które mają być dostępne.

Udostępnianie wyłącznie focus() i clear()

Typowym wzorcem jest niestandardowy input udostępniający tylko metody focus i clear. Wewnątrz fabryki zwraca się obiekt z tymi dwiema metodami, z których każda działa na wewnętrznym ref wskazującym rzeczywisty input.

Rodzic może teraz ustawić fokus na polu lub je wyczyścić, ale nie może odczytać jego surowego atrybutu value ani wywoływać dowolnych zachowań DOM, co zapewnia przewidywalne użycie.

Udostępnianie open() i close() w komponencie Modal

Uchwyty imperatywne dobrze sprawdzają się w przypadku okien dialogowych. Komponent Modal może udostępniać metody open i close, które zmieniają jego wewnętrzny stan widoczności, pozwalając rodzicowi sterować nim imperatywnie bez samodzielnego zarządzania wartością logiczną open.

Jest to wygodne w kodzie, który musi wywoływać okno dialogowe z wielu miejsc, na przykład wyświetlać potwierdzenie po zakończeniu asynchronicznej operacji.

Ograniczony zakres API to dobre projektowanie

Zwracając tylko metody, które mają być obsługiwane, tworzy się jasny kontrakt. Konsumenci zależą od niewielkiego, udokumentowanego zestawu operacji zamiast od rozbudowanego API DOM, dzięki czemu przyszłe refaktoryzacje są bezpieczniejsze.

Wąski zakres imperatywny łatwiej testować i zrozumieć, a także znacznie rzadziej powoduje problemy przy zmianie wewnętrznej implementacji.

Tablica zależności

useImperativeHandle przyjmuje opcjonalny trzeci argument — tablicę zależności. Gdy zmieni się dowolna zależność, fabryka jest uruchamiana ponownie, a obiekt uchwytu tworzony od nowa, podobnie jak w przypadku useMemo i useEffect.

Jeśli udostępniane metody korzystają z wartości, które mogą się zmieniać, należy umieścić te wartości wśród zależności, aby rodzic zawsze otrzymywał uchwyt powiązany z aktualnym stanem.

Zawsze w połączeniu z forwardRef

useImperativeHandle ma sens tylko wewnątrz komponentu opakowanego za pomocą forwardRef, ponieważ potrzebuje przekazanego ref, do którego przypisze niestandardowy uchwyt. Samodzielnie nie miałby żadnego ref rodzica do uzupełnienia.

Te dwa mechanizmy są więc używane razem: forwardRef przekazuje ref do środka, a useImperativeHandle określa, na co ten ref ostatecznie wskazuje.

Testowanie uchwytów imperatywnych

Aby przetestować uchwyt, należy wyrenderować komponent z ref, a następnie wywołać metody za pośrednictwem ref.current wewnątrz bloku act i sprawdzić wynikające z tego działanie lub zmiany w DOM.

Ponieważ udostępniany zakres jest niewielki i jasno określony, testy te są skoncentrowane: weryfikują, czy każda udokumentowana metoda działa zgodnie z kontraktem, zamiast zaglądać do szczegółów implementacji.

Typowanie uchwytu w TypeScript

W TypeScript definiuje się interfejs opisujący uchwyt, na przykład zawierający metody focus i clear, a następnie używa się go do typowania zarówno typu generycznego forwardRef, jak i ref przechowywanego przez rodzica.

Zapewnia to autouzupełnianie i kontrole w czasie kompilacji w miejscu wywołania, dzięki czemu konsumenci widzą dokładnie, jakie metody istnieją, a ich nieprawidłowe użycie zostaje wykryte przed uruchomieniem.

Szybki test: przeznaczenie useImperativeHandle

Sprawdź, do czego właściwie służy useImperativeHandle.

Podsumowanie: useImperativeHandle

useImperativeHandle dostosowuje to, co udostępnia przekazany ref, przyjmując ref oraz fabrykę zwracającą obiekt uchwytu. Używa się go do udostępniania niewielkiego API, takiego jak focus i clear albo open i close w komponencie modal.

Zawsze łączy się go z forwardRef; obsługuje tablicę zależności do odświeżania uchwytu i dobrze współpracuje z interfejsami TypeScript oraz skoncentrowanymi testami. Ograniczony zakres jest zamierzony i stanowi przejaw dobrego projektowania.

Często zadawane pytania

Czy lekcja „useImperativeHandle: niestandardowe wartości instancji” jest bezpłatna?

Tak — pełny tekst „useImperativeHandle: niestandardowe wartości instancji” 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 „useImperativeHandle: niestandardowe wartości instancji”?

Proszę używać useImperativeHandle do precyzyjnego kontrolowania tego, co widzi komponent nadrzędny przechowujący ref do Państwa komponentu. Ć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 2 z 4.

Ile czasu zajmuje lekcja „useImperativeHandle: niestandardowe wartości instancji”?

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