Code: Select all
@tanstack/react-tableMeine Architektur folgt dem Feature-Sliced Design (FSD)-Muster:
- [/b]: Ein Reaktionskontext, der den gesamten Status mithilfe eines benutzerdefinierten useLibrary-Hooks speichert. Dies stellt viewMode, sichtbareBeats (das Datenarray), Sortierung, setSorting, rowSelection und setRowSelection bereit.
Code: Select all
LibraryProvider - (Smart Component):[/b] Diese Komponente verbraucht useLibrary(). Es ist für die Erstellung der Tabelleninstanz mit useReactTable() verantwortlich.
Code: Select all
LibraryContent - & LibraryGrid (Dumme Komponenten):[/b] Dies sind die beiden verschiedenen Ansichtsmodi.
Code: Select all
LibraryTable
Code: Select all
"use client"
import LibraryToolbar from "@/features/library/components/LibraryToolbar"
import {
LibraryProvider,
useLibrary
} from "@/features/library/contexts/LibraryContext"
import LibraryBatchActionsBar from
"@/features/library/components/LibraryBatchActionsBar"
import LibraryTable from "@/features/library/components/LibraryTable"
import { columns } from "@/features/library/components/columns"
import {
getCoreRowModel,
getSortedRowModel,
useReactTable
} from "@tanstack/react-table"
import LibraryGrid from "@/features/library/components/LibraryGrid"
export default function LibraryPage() {
return (
[*]
)
}
function LibraryContent() {
const {
viewMode,
visibleBeats,
setSorting,
setRowSelection,
sorting,
rowSelection
} = useLibrary()
const table = useReactTable({
data: visibleBeats,
columns: columns,
getCoreRowModel: getCoreRowModel(),
onSortingChange: setSorting,
onRowSelectionChange: setRowSelection,
getSortedRowModel: getSortedRowModel(),
state: {
sorting,
rowSelection,
}
})
return (
{viewMode === "list" ?
:
}
)
}
Code: Select all
"use client"
import {
Table as TableUI,
TableBody,
TableCell,
TableHeader,
TableRow,
TableHead
} from "@/shared/ui/table"
import { flexRender, Table } from "@tanstack/react-table"
import { useLibrary } from "../contexts/LibraryContext"
import { LoaderCircle } from "lucide-react"
export default function LibraryTable({ table }: { table: Table }) {
const { isLoading } = useLibrary()
const rowClass = "border-border cursor-pointer transition-all duration-200 hover:bg-gray-100"
return (
{table.getHeaderGroups().map((headerGroup) => (
{headerGroup.headers.map((header) => {
return (
{header.isPlaceholder
? null
: flexRender(
header.column.columnDef.header,
header.getContext()
)
}
)
})}
))}
{table.getRowModel().rows?.length
? (
table.getRowModel().rows.map((row) => (
{row.getVisibleCells().map((cell) => (
{flexRender(cell.column.columnDef.cell, cell.getContext())}
))}
))
) : (
{isLoading
? : "No beats yet."
}
)
}
)
}
Wenn ich mich in der Listenansicht befinde (
Code: Select all
LibraryTable- Die onRowSelectionChange (oder onSortingChange) wird korrekt ausgelöst.
- Die LibraryContent-Komponente wird erneut gerendert (ich habe dies mit Protokollen bestätigt).
- wird erneut mit dem neuen Sortierstatus oder rowSelection aufgerufen.
Code: Select all
useReactTable - Die LibraryTable-Benutzeroberfläche wird nicht aktualisiert. Der data-state="selected" wird nicht angewendet und die Spaltenreihenfolge ändert sich nicht.
Code: Select all
LibraryGrid- empfängt table.getRowModel().rows als Requisite.
Code: Select all
LibraryGrid - Wenn ich den Sortierstatus ändere (über ein separates Dropdown-Menü), wird der Status aktualisiert, LibraryContent wird neu gerendert und table.getRowModel().rows ist ein neues, sortiertes Array.
- wird neu gerendert und funktioniert perfekt.
Code: Select all
GridView
Meine Frage
Was ist die Best Practice für diese Architektur? Ist die Übergabe des vollständigen Tabellenobjekts als Requisite grundsätzlich fehlerhaft oder fehlt mir eine Möglichkeit, meine LibraryTable auf die internen Statusänderungen des Tabellenobjekts reagieren zu lassen (wie Sortierung und Zeilenauswahl)?
Mobile version