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ó
- useMemohaszná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
- restrictToWindowEdgesmodifier 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: