DndContext, useDraggable i useDroppable
Podłączać providera DndContext oraz tworzyć elementy przeciągalne i upuszczalne za pomocą odpowiednich hooków
DndContext, useDraggable i useDroppable 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.
Opakowywanie funkcji w DndContext
Każda funkcja przeciągania i upuszczania w dnd-kit musi być opakowana w komponent DndContext. DndContext jest centrum koordynacji — śledzi aktywne przeciąganie, zapewnia komunikację między elementami, które można przeciągać i na które można upuszczać elementy, oraz wywołuje wywołania zwrotne zdarzeń. Zwykle umieszcza się go na poziomie komponentu zarządzającego stanem przeciągania.
Budowa hooka useDraggable
Hook useDraggable({ id }) sprawia, że komponent można przeciągać. Zwraca cztery kluczowe wartości: attributes (właściwości ARIA do rozpropagowania na elemencie), listeners (procedury obsługi zdarzeń rozpoczynających przeciąganie), setNodeRef (przypisuje ref przeciąganego elementu) oraz transform (bieżące przesunięcie w postaci {x, y, scaleX, scaleY}).
Zastosowanie useDraggable do elementu
Aby skonfigurować element, który można przeciągać, należy rozpropagować attributes i listeners na elemencie oraz przekazać setNodeRef jako właściwość ref. Atrybuty zawierają role="button", tabIndex i właściwości aria. Listenery dołączają procedury obsługi zdarzeń wskaźnika i klawiatury, których dnd-kit potrzebuje do wykrywania rozpoczęcia przeciągania.
Zastosowanie stylu transformacji
Wartość transform z useDraggable ma wartość null, gdy element nie jest przeciągany, a podczas przeciągania jest obiektem współrzędnych. Należy przekonwertować ją na ciąg CSS za pomocą CSS.Translate.toString(transform) z pakietu @dnd-kit/utilities. Wartość tę należy zastosować jako właściwość CSS transform przeciąganego elementu, aby wizualnie podążał za kursorem.
Budowa hooka useDroppable
Hook useDroppable({ id }) oznacza kontener jako prawidłowe miejsce upuszczenia. Zwraca isOver (wartość logiczną, która przyjmuje wartość true, gdy przeciągany element znajduje się nad tym miejscem) oraz setNodeRef, służący do przypisania ref do elementu. W przeciwieństwie do useDraggable nie ma tu listenerów, które należałoby rozpropagować.
Informacja wizualna za pomocą isOver
Wartość isOver z useDroppable pozwala zapewnić wizualną informację zwrotną podczas przeciągania. Gdy isOver ma wartość true, można zastosować kolor wyróżnienia, obramowanie lub zmianę tła strefy upuszczania. Pomaga to użytkownikom zrozumieć, gdzie mogą upuścić element, co ma kluczowe znaczenie dla użyteczności i dostępności.
onDragEnd: odczytywanie wyniku
Wywołanie zwrotne onDragEnd komponentu DndContext otrzymuje obiekt zdarzenia z dwiema ważnymi właściwościami: event.active zawiera przeciągany element (w tym jego id), a event.over zawiera miejsce upuszczenia (lub null, jeśli element upuszczono poza dowolnym miejscem upuszczania). Tych identyfikatorów należy użyć do zaktualizowania stanu aplikacji.
Aktualizowanie stanu po upuszczeniu
W onDragEnd, po sprawdzeniu, że event.over nie ma wartości null, należy zaktualizować stan tak, aby odzwierciedlał przeniesienie elementu. Jeśli na przykład karta jest przenoszona między kolumnami tablicy Kanban, należy usunąć ją z kolumny źródłowej i dodać do kolumny docelowej wskazanej przez event.over.id.
DragOverlay na potrzeby pływającego podglądu
DragOverlay renderuje pływający podgląd przeciąganego elementu, który podąża za kursorem. Jest renderowany jako portal (poza zwykłym drzewem DOM), dzięki czemu nigdy nie zostanie przycięty przez kontenery z overflow:hidden. W przeciwieństwie do oryginalnego elementu nakładka może mieć cień, transformacje skalowania lub obrót sygnalizujące, że element jest przeciągany.
Śledzenie activeDragId na potrzeby nakładki
Aby wyrenderować właściwą zawartość w DragOverlay, należy śledzić aktualnie przeciągany element za pomocą callbacku onDragStart. Aktywny identyfikator należy przechowywać w stanie: setActiveDragId(event.active.id). W onDragEnd należy zresetować go do wartości null. Wewnątrz DragOverlay należy użyć activeDragId do wyszukania właściwego elementu i wyrenderowania go.
Łączenie elementów Draggable i Droppable
Rzeczywisty interfejs przeciągania i upuszczania łączy DndContext, wiele elementów useDraggable, wiele obszarów useDroppable oraz zarządzanie stanem śledzącym położenie poszczególnych elementów. Najważniejszy wniosek jest taki, że dnd-kit zapewnia mechanikę działania — do Państwa należy aktualizowanie stanu w onDragEnd oraz ponowne renderowanie interfejsu tak, aby odzwierciedlał nowy układ.
Stosowanie stylu transform
Które narzędzie konwertuje obiekt transform z useDraggable na ciąg znaków transformacji CSS?
Podsumowanie lekcji: podstawowe hooki
DndContext jest centrum koordynacji wszystkich operacji przeciągania w dnd-kit. useDraggable udostępnia atrybuty, listenery, setNodeRef i transform dla elementów, które można przeciągać. useDroppable udostępnia isOver i setNodeRef dla celów upuszczania. onDragEnd zapewnia event.active.id oraz event.over?.id, których należy użyć do aktualizacji stanu. DragOverlay renderuje pływający podgląd oparty na portalu.
Często zadawane pytania
Czy lekcja „DndContext, useDraggable i useDroppable” jest bezpłatna?
Tak — pełny tekst „DndContext, useDraggable i useDroppable” 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 „DndContext, useDraggable i useDroppable”?
Podłączać providera DndContext oraz tworzyć elementy przeciągalne i upuszczalne za pomocą odpowiednich hooków Ć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 „DndContext, useDraggable i useDroppable”?
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
- Architektura dnd-kit i projektowanie z naciskiem na dostępność
- DndContext, useDraggable i useDroppable
- SortableContext dla list ze zmianą kolejności
- Własne nakładki przeciągania i DnD w wielu kontenerach