Kanban tábla - dnd-kit implementáció
Áttekintés
A projektben használt kanban tábla a drag-and-drop funkcionalitásra, a @dnd-kit
könyvtárra épül, amely egy hatékony és akadálymentes megoldást biztosít a React alkalmazásokban. Az implementáció három fő komponensből áll: a húzható feladatkártyákból (TaskCard), a célterületekből (Column) és a fő DndContext komponensből (DndTaskMain).
Komponensek
TaskCard Komponens
A TaskCard komponens a useDraggable
hook-ot használja a húzható feladatkártyák létrehozásához.
Főbb tulajdonságok:
- Egyedi azonosító alapján követhető (
task.id
) - Vizuális visszajelzést ad húzás közben (transform tulajdonság)
- Akadálymentes kezelőfelületet biztosít
- Touch eseményeket is kezel
- Zökkenőmentes mozgatás mobilon
- Megakadályozza a redundáns eseménykezelést
Column Komponens
A Column komponens a useDroppable
hook-ot használja a célterületek definiálásához.
Főbb tulajdonságok:
- Egyedi azonosítóval rendelkező drop zónák
- Vizuális visszajelzés az üres állapotról
- Rugalmas magasságkezelés
- Reszponzív design
DndTaskMain Komponens
A fő komponens, amely a DndContext-et biztosítja és kezeli a drag-and-drop logikát.
Állapotkezelés:
dnd-task-main.tsx
const { tasks, setTasks } = useTaskContext()
Oszlopok definiálása:
dnd-task-main.tsx
const COLUMNS: ColumnType[] = [
{ id: "pending", title: "Elvégzendő" },
{ id: "in progress", title: "Folyamatban" },
{ id: "finished", title: "Befejezett" },
]
Rendezési logika:
dnd-task-main.tsx
const sortTasks = (a: EnrichedTask, b: EnrichedTask) => {
const priorityOrder = { high: 3, medium: 2, low: 1 }
if (priorityOrder[a.priority] !== priorityOrder[b.priority]) {
return priorityOrder[b.priority] - priorityOrder[a.priority]
}
return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()
}
Drag and Drop kezelés:
dnd-task-main.tsx
async function handleDragEnd(event: DragEndEvent) {
const { active, over } = event
if (!over) return
const taskId = active.id as string
const newStatus = over.id as TaskStatus
// ... státusz frissítés és hibakezelés
}
Optimalizációk
Memorizáció
useMemo
használata a rendezett feladatok számításához- Feladatok szűrése és rendezése oszloponként
dnd-task-main.tsx
const sortedColumnTasks = useMemo(() => {
return COLUMNS.reduce((acc, column) => {
acc[column.id] = tasks
.filter((task) => task.status === column.id)
.sort(sortTasks)
return acc
}, {} as Record<TaskStatus, EnrichedTask[]>)
}, [tasks])
Korlátozások
restrictToWindowEdges
modifier használata a húzás korlátozásához- Optimalizált újrarenderelés
- Suspense használata a lazy loadinghoz
Hibakezelés
Optimista frissítések
- Azonnali UI frissítés
- Backend művelet végrehajtása
- Hiba esetén visszaállítás
- Toast üzenetek a felhasználói visszajelzéshez
dnd-task-main.tsx
setTasks((prevTasks) => /* optimista frissítés */);
const result = await changeTaskStatus(/*...*/);
if (!result.success) {
setTasks((prevTasks) => /* visszaállítás */);
toast.error("Hiba történt!");
}
Típusdefiníciók
dnd-task-main.tsx
export type TaskStatus = "pending" | "in progress" | "finished"
export type ColumnType = {
id: TaskStatus
title: string
}
Reszponzivitás
- Flexbox alapú elrendezés
- Oszlopok adaptív megjelenítése
- Gap-ek használata az elemek között
.column-layout {
flex-col gap-8 xl:flex-row
}
Teljesítmény Megfontolások
- Memorizált értékek használata
- Optimista UI frissítések
- Suspense alapú kód szétválasztás
- Hatékony újrarenderelés kezelés
Továbbfejlesztési Lehetőségek
- Drag animációk finomhangolása
- Többszörös kijelölés támogatása
- Drag preview testreszabása
- Billentyűzetes navigáció bővítése
- Offline támogatás implementálása
Utoljára frissítve: