Kontrolowany input z listą sugestii
Budować podstawę: kontrolowany input wyświetlający poniżej filtrowaną listę sugestii
Kontrolowany input z listą sugestii 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.
Przegląd struktury komponentu
Komponent autouzupełniania składa się z dwóch głównych części: kontrolowanego pola tekstowego oraz listy rozwijanej z sugestiami. Pole znajduje się w normalnym przepływie dokumentu, a lista rozwijana jest pozycjonowana absolutnie bezpośrednio pod nim. Razem działają jak pojedynczy interaktywny widget, mimo że są osobnymi elementami DOM.
Wymagane zmienne stanu
Potrzebne są cztery zmienne stanu: inputValue (string — wpisany tekst), suggestions (array — aktualnie pasujące elementy), isOpen (boolean — określa, czy lista rozwijana jest widoczna) oraz selectedIndex (number — wskazuje sugestię wyróżnioną podczas nawigacji klawiaturą; wartość początkowa -1 oznacza brak zaznaczenia).
Sterowanie polem tekstowym
Pole tekstowe należy w pełni kontrolować: value={inputValue} oraz onChange={e => setInputValue(e.target.value)}. Dzięki temu React przejmuje pełną kontrolę nad wyświetlanym tekstem. Każde naciśnięcie klawisza aktualizuje stan, co wywołuje ponowne renderowanie z nową wartością. W przypadku autouzupełniania nie należy używać pola niekontrolowanego — trzeba mieć możliwość programowego odczytywania i ustawiania jego wartości.
Filtrowanie statycznej listy
Gdy sugestie pochodzą z lokalnej tablicy, należy filtrować ją podczas każdego renderowania na podstawie inputValue: porównać każdy element za pomocą item.toLowerCase().includes(inputValue.toLowerCase()). Jeśli lista jest duża, można obliczać ten wynik za pomocą useMemo, aby uniknąć ponownego filtrowania przy każdym renderowaniu. W przypadku małych list filtrowanie bezpośrednio w kodzie jest wystarczające.
Wyświetlanie i ukrywanie listy rozwijanej
Listę rozwijaną należy otwierać, gdy inputValue.length > 0 oraz suggestions.length > 0. Należy ją zamykać, gdy pole traci fokus (z niewielkim opóźnieniem, aby kliknięcie sugestii mogło się najpierw zarejestrować), po wybraniu sugestii albo po naciśnięciu klawisza Escape. Wartość isOpen należy ustawiać odpowiednio, aby sterowała renderowaniem warunkowym.
Obsługa blur z opóźnieniem
Zdarzenie onBlur jest wywoływane, gdy pole tekstowe traci fokus, co następuje między innymi po kliknięciu sugestii. Jeśli lista rozwijana zostanie zamknięta natychmiast po blur, kliknięcie sugestii nie zostanie zarejestrowane, ponieważ lista zniknie przed wywołaniem zdarzenia click. Należy użyć setTimeout(() => setIsOpen(false), 150), aby dać kliknięciu czas na rejestrację.
Stylowanie listy rozwijanej
Listę rozwijaną należy pozycjonować za pomocą position: absolute, aby nakładała się na zawartość poniżej pola, zamiast przesuwać ją w dół. Należy ustawić wysoką wartość z-index (100 lub większą), aby lista wyświetlała się nad inną zawartością. Ustawienie max-height wraz z overflow-y: auto zapobiega nadmiernemu wydłużaniu się listy przy dużej liczbie wyników.
Umożliwianie klikania sugestii
Każdy element sugestii powinien mieć handler onClick: onClick={() => { setInputValue(suggestion); setIsOpen(false); }}. Ustawia to wybraną sugestię w polu tekstowym i zamyka listę rozwijaną. Wybór jest natychmiastowy i naturalny, zgodny z oczekiwanym przez użytkowników działaniem pól autouzupełniania.
Zapobieganie blur przed kliknięciem
Alternatywą dla opóźnienia blur jest użycie onMouseDown={e => e.preventDefault()} na każdym elemencie sugestii. Zapobiega to przejęciu fokusu pola tekstowego przez zdarzenie mousedown, dzięki czemu podczas klikania sugestii zdarzenie blur nie jest wywoływane. Pole zachowuje fokus, a handler click jest wywoływany bez problemów.
Przegląd interakcji z klawiaturą
Dobre autouzupełnianie musi umożliwiać nawigację za pomocą klawiatury. Użytkownik powinien móc nacisnąć ArrowDown, aby wyróżnić pierwszą sugestię, naciskać ten klawisz ponownie, aby poruszać się w dół listy, nacisnąć Enter, aby wybrać element, oraz Escape, aby zamknąć listę bez wyboru. Implementuje się to przez obsługę onKeyDown na elemencie pola tekstowego.
Resetowanie selectedIndex przy zmianie pola
Za każdym razem, gdy użytkownik pisze i zmienia się inputValue, należy zresetować selectedIndex do wartości -1. Usuwa to poprzedni wybór klawiaturowy, dzięki czemu nowy zestaw filtrowanych sugestii rozpoczyna się bez wyróżnionego elementu. Nieaktualny indeks wskazujący po zmianie listy na inny element byłby mylący i niepoprawny.
Kolejność zdarzeń blur i MouseDown
Dlaczego na elementach sugestii należy używać onMouseDown z e.preventDefault() zamiast polegać na opóźnieniu blur?
Podsumowanie lekcji: kontrolowane pole z sugestiami
Widget autouzupełniania potrzebuje czterech zmiennych stanu: inputValue, suggestions, isOpen oraz selectedIndex. Należy użyć kontrolowanego pola tekstowego, filtrować sugestie na podstawie wartości pola i zarządzać widocznością listy rozwijanej za pomocą isOpen. Problem wyścigu między blur a kliknięciem należy rozwiązać za pomocą timeoutu albo onMouseDown z preventDefault. Po każdej zmianie pola należy zresetować selectedIndex.
Często zadawane pytania
Czy lekcja „Kontrolowany input z listą sugestii” jest bezpłatna?
Tak — pełny tekst „Kontrolowany input z listą sugestii” 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 „Kontrolowany input z listą sugestii”?
Budować podstawę: kontrolowany input wyświetlający poniżej filtrowaną listę sugestii Ć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 „Kontrolowany input z listą sugestii”?
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
- Kontrolowany input z listą sugestii
- Nawigacja klawiaturą po listach sugestii
- Asynchroniczne sugestie z debounce
- Dostępność widgetów autouzupełniania