SortableContext dla list ze zmianą kolejności
Używać SortableContext i useSortable do budowania list ze zmianą kolejności i płynnymi animacjami
SortableContext dla list ze zmianą kolejności to bezpłatna lekcja React Academy na CoddyKit. To lekcja 3 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.
Działanie SortableContext
SortableContext to specjalizowany komponent dnd-kit, który opakowuje listę, której kolejność można zmieniać. Podczas gdy useDraggable i useDroppable obsługują dowolne przeciąganie i upuszczanie, SortableContext jest przeznaczony konkretnie do sytuacji, w której elementy listy należy uporządkować na nowo przez przeciągnięcie ich w inne miejsce.
Prop items
SortableContext wymaga propu items: tablicy unikalnych identyfikatorów typu string lub number, odpowiadających identyfikatorom używanym w podrzędnych komponentach sortowalnych. Kolejność tej tablicy określa bieżącą kolejność elementów. Po zaktualizowaniu tej tablicy w stanie lista zostanie ponownie wyrenderowana w nowej kolejności.
Strategie sortowania
SortableContext przyjmuje prop strategy, który określa sposób sortowania elementów. verticalListSortingStrategy służy do list pionowych i oblicza punkt wstawienia na podstawie położenia w pionie. horizontalListSortingStrategy służy do list poziomych. rectSortingStrategy służy do siatek. Należy wybrać strategię odpowiadającą układowi interfejsu.
Hook useSortable
Wewnątrz SortableContext każdy element listy korzysta z hooka useSortable({ id }) zamiast useDraggable. useSortable jest rozszerzeniem useDraggable — zwraca te same atrybuty, listenery, setNodeRef i transform, a także dodatkowe wartości związane z sortowaniem, takie jak isDragging i overIndex.
isDragging na potrzeby stanu wizualnego
Wartość isDragging z useSortable wynosi true, gdy element jest aktywnie przeciągany. Zwykle służy ona do zmniejszenia krycia oryginalnego elementu na liście albo dodania mu stylu zastępczego na czas przeciągania. Ta wizualna luka pokazuje użytkownikowi, gdzie element znajduje się obecnie na liście.
Narzędzie arrayMove
dnd-kit eksportuje narzędzie arrayMove(array, fromIndex, toIndex) z @dnd-kit/sortable. Zwraca ono nową tablicę, w której element znajdujący się pod indeksem fromIndex został przeniesiony pod indeks toIndex. Jest to standardowy sposób aktualizowania tablicy stanu po zakończeniu sortowania przez przeciąganie.
Implementowanie onDragEnd na potrzeby sortowania
W callbacku onDragEnd komponentu DndContext dla listy sortowalnej należy znaleźć stary i nowy indeks za pomocą items.indexOf(event.active.id) oraz items.indexOf(event.over?.id). Jeśli oba indeksy są prawidłowe i różne, należy wywołać setItems(arrayMove(items, oldIndex, newIndex)), aby zmienić kolejność tablicy.
Płynna animacja przesuwanych elementów
Podczas przeciągania elementu pozostałe elementy listy animują się do nowych pozycji, pokazując, gdzie wyląduje przeciągany element. useSortable udostępnia transformację CSS dla każdego nieprzeciąganego elementu, która przesuwa go, aby zrobić miejsce. Dodanie przejścia CSS do tej transformacji zapewnia płynną animację ruchu.
Przejście zapewniające płynny ruch
Należy zastosować przejście CSS dla właściwości transform elementów sortowalnych: transition: isDragging ? undefined : transform ? 'transform 200ms ease' : undefined. Gdy element jest przeciągany, przejście nie jest potrzebne, ponieważ powinien bezpośrednio podążać za kursorem. Gdy element zostaje przesunięty, przejście tworzy płynną animację przesuwania.
Łączenie z DragOverlay
Aby zapewnić najlepszą obsługę użytkownika, należy połączyć SortableContext z DragOverlay. Przeciągany element na liście staje się półprzezroczystym elementem zastępczym (z użyciem isDragging), a DragOverlay renderuje nieprzezroczystą, uniesioną kopię podążającą za kursorem. Takie podejście pozwala uniknąć błędów wizualnych, w których przeciągany element przeskakuje między pozycjami.
Listy pionowe i poziome
SortableContext równie dobrze sprawdza się w przypadku list pionowych (tablic z zadaniami, list zadań do wykonania) i poziomych (pasków kart, karuzel obrazów). Między strategiami można przełączać się przez zmianę propu strategy. Można go także użyć w układzie siatki ze strategią rectSortingStrategy, która oblicza najbliższą komórkę siatki na podstawie położenia przeciąganego elementu.
arrayMove w onDragEnd
Jakie argumenty przyjmuje arrayMove, gdy jest wywoływane wewnątrz onDragEnd w celu zmiany kolejności listy sortowalnej?
Podsumowanie lekcji: SortableContext
SortableContext opakowuje listę, której kolejność można zmieniać, i wymaga tablicy items zawierającej unikalne identyfikatory oraz strategii (pionowej, poziomej lub siatki). Każdy element korzysta z useSortable zamiast useDraggable, zyskując isDragging i overIndex. W onDragEnd funkcja arrayMove(items, oldIndex, newIndex) zmienia kolejność tablicy. Przejścia CSS zastosowane do transform zapewniają płynną animację przesuwanych elementów.
Często zadawane pytania
Czy lekcja „SortableContext dla list ze zmianą kolejności” jest bezpłatna?
Tak — pełny tekst „SortableContext dla list ze zmianą kolejności” 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 „SortableContext dla list ze zmianą kolejności”?
Używać SortableContext i useSortable do budowania list ze zmianą kolejności i płynnymi animacjami Ć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 3 z 4.
Ile czasu zajmuje lekcja „SortableContext dla list ze zmianą kolejności”?
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