DataTable
Table üzerinde sıralama, arama ve kolon filtreleri, sayfalama, checkbox ile satır seçimi ve kolon görünürlüğü. State'i useDataTable tutar; DataTable render'lar. Bağımlılık yok.
| E-posta | |||||
|---|---|---|---|---|---|
| Ada Lovelace | ada@northwind.dev | Sahip | Aktif | 12 | |
| Grace Hopper | grace@northwind.dev | Yönetici | Aktif | 9 | |
| Alan Turing | alan@northwind.dev | Üye | Aktif | 7 | |
| Katherine Johnson | katherine@northwind.dev | Üye | Davet edildi | 0 | |
| Margaret Hamilton | margaret@northwind.dev | Yönetici | Aktif | 15 |
import { Badge, DataTable, type DataTableColumn, useDataTable } from "@meridui/react";
const columns: DataTableColumn<Member>[] = [
{ id: "name", header: "Ad", accessor: "name", sortable: true, hideable: false },
{ id: "email", header: "E-posta", accessor: "email" },
{ id: "role", header: "Rol", accessor: "role", sortable: true },
{
id: "status",
header: "Durum",
accessor: "status",
sortable: true,
cell: (row) => <Badge tone={row.status === "Aktif" ? "success" : "neutral"}>{row.status}</Badge>,
},
{ id: "projects", header: "Projeler", accessor: "projects", sortable: true, align: "end" },
];
export function Members({ members }: { members: Member[] }) {
const table = useDataTable({ data: members, columns, defaultPageSize: 5 });
return (
<DataTable
table={table}
caption="Ekip üyeleri"
selectable
getRowLabel={(row) => row.name}
pageSizeOptions={[5, 10]}
labels={labelsTr}
/>
);
}Import
import { DataTable, useDataTable, type DataTableColumn } from "@meridui/react";Anatomi
const table = useDataTable({ data, columns });
<DataTable table={table} caption="…" />- Kolonlar her alanı tanımlar:
accessor(bir anahtar ya da fonksiyon) sıralamayı, aramayı ve varsayılan hücreyi besler;cellbaşka her şeyi render'lar. - useDataTable headless'tır: geçerli sayfanın satırlarını ve her setter'ı döndürür. Her state parçası controlled ya da uncontrolled çalışır.
- DataTable bir araç satırı (arama, Kolonlar menüsü, senin
toolbar'ın), sıralanabilir başlıkları ve isteğe bağlı checkbox'larıyla Table'ı, ve durum satırı, sayfa başına satır seçimi ile Pagination'dan oluşan bir alt bilgi render'lar.
Örnekler
Kolon filtreleri, varsayılan sıralama ve gizli kolonlar
Kendi filtre kontrollerini toolbar'a koy ve onları setColumnFilter ile yönet. Bir kolonun filterFn'i varsayılan "içerir" eşleşmesinin yerini alır.
| Margaret Hamilton | Yönetici | Aktif | 15 |
| Ada Lovelace | Sahip | Aktif | 12 |
| Grace Hopper | Yönetici | Aktif | 9 |
| Alan Turing | Üye | Aktif | 7 |
| Barbara Liskov | Üye | Aktif | 5 |
| Frances Allen | Üye | Aktif | 4 |
| Linus Torvalds | İzleyici | Aktif | 2 |
| Katherine Johnson | Üye | Davet edildi | 0 |
| Edsger Dijkstra | İzleyici | Davet edildi | 0 |
const table = useDataTable({
data: members,
columns,
defaultSort: { columnId: "projects", direction: "descending" },
defaultHiddenColumns: ["email"],
});
<DataTable
table={table}
caption="Role göre ekip üyeleri"
labels={labelsTr}
toolbar={
<NativeSelect
size="sm"
aria-label="Rol"
value={table.columnFilters.role ?? ""}
onChange={(event) => table.setColumnFilter("role", event.target.value)}
>
<option value="">Tüm roller</option>
<option value="Sahip">Sahip</option>
{/* … */}
</NativeSelect>
}
/>Metinleri çevirmek
Görünen ve ekran okuyucuya giden her metin labels ile değişir; varsayılanlar İngilizcedir. Bu sayfadaki örnekler şu nesneyi kullanıyor:
const labelsTr: Partial<DataTableLabels> = {
search: "Ara",
searchPlaceholder: "Ara…",
columns: "Kolonlar",
selectPage: "Bu sayfadaki tüm satırları seç",
selectRow: (label) => `${label} satırını seç`,
selected: (count, total) => `${total} satırdan ${count} tanesi seçili`,
results: (count) => `${count} sonuç`,
empty: "Sonuç yok.",
rowsPerPage: "Sayfa başına satır",
pagination: "Sayfalama",
previousPage: "Önceki sayfa",
nextPage: "Sonraki sayfa",
page: (page) => `Sayfa ${page}`,
};Headless
DataTable'ın düzeni uymadığında (örneğin mobilde kart listesi) aynı state'ten kendi markup'ını render'la.
const table = useDataTable({ data, columns });
// DataTable'ın render'ladığı her şey kendi markup'ın için de hazır:
table.rows; // geçerli sayfa, filtrelenmiş ve sıralanmış
table.toggleSort("name");
table.setGlobalFilter("ada");
table.setPage(2);
table.toggleRow(table.getRowId(row));
table.selectedRows; // tüm sayfalarda
table.toggleColumn("email", false);Hook, verdiğin satırlar üzerinde çalışır. Sunucu tarafında sıralama ya da sayfalama için kendi state'inle veri çek ve doğrudan Table render'la.
API referansı
DataTableColumn
| Prop | Tip | Varsayılan | Açıklama |
|---|---|---|---|
id | string | – | Benzersiz kolon id'si. |
header | ReactNode | – | Başlık içeriği. |
label | string | – | Kolonlar menüsü için düz metin ad. header string ise varsayılanı odur. |
accessor | keyof Row | (row) => unknown | – | Sıralama, arama ve varsayılan hücre için değer. |
cell | (row) => ReactNode | – | Hücre içeriği. Varsayılanı accessor değerinin metni. |
sortable | boolean | false | Bu kolona göre sıralamaya izin verir. |
sortFn | (a, b) => number | – | Özel artan sıralama karşılaştırması. Varsayılanı sayı, tarih ve doğal metin sırası; boş değerler en sonda. |
searchable | boolean | accessor varsa true | Kolonu genel aramaya dahil eder. |
filterFn | (row, filter: string) => boolean | – | Kolona özel filtre. |
hideable | boolean | true | Kolonu Kolonlar menüsünde listeler. |
align | "start" | "center" | "end" | "start" | Metin hizası; sayılar için end. |
useDataTable
Her state'in bir controlled prop'u, bir default… prop'u ve bir on…Change callback'i vardır.
| Prop | Tip | Varsayılan | Açıklama |
|---|---|---|---|
data | Row[] | – | Tüm satırlar. Memoize et. |
columns | DataTableColumn<Row>[] | – | Kolon tanımları. |
getRowId | (row, index) => string | row.id ?? index | Seçim için kararlı id. |
sort / defaultSort / onSortChange | { columnId, direction } | null | – | Aynı anda tek sıralı kolon. |
globalFilter / defaultGlobalFilter / onGlobalFilterChange | string | – | Arama metni; her kelime aranabilir bir kolonda geçmeli. |
columnFilters / defaultColumnFilters / onColumnFiltersChange | Record<string, string> | – | Kolon filtreleri. |
page / defaultPage / onPageChange | number | 1 | Geçerli sayfa, 1'den başlar. |
pageSize / defaultPageSize / onPageSizeChange | number | 10 | Sayfa başına satır. |
selection / defaultSelection / onSelectionChange | string[] | – | Seçili satır id'leri. |
hiddenColumns / defaultHiddenColumns / onHiddenColumnsChange | string[] | – | Gizli kolon id'leri. |
rows, filteredRows, visibleColumns, page, pageCount, pageSelection ("all" | "some" | "none"), selectedRows ile toggleSort, setGlobalFilter, setColumnFilter, setPage, setPageSize, toggleRow, togglePage, clearSelection ve toggleColumn setter'larını döndürür. Bir filtreyi ya da sayfa boyutunu değiştirmek 1. sayfaya döner.
DataTable
Tüm Table prop'larını kabul eder.
| Prop | Tip | Varsayılan | Açıklama |
|---|---|---|---|
table | DataTableInstance<Row> | – | useDataTable'dan gelen state. |
caption | ReactNode | – | Tabloyu adlandırır; showCaption verilmedikçe görsel olarak gizlidir. |
showCaption | boolean | false | Caption'ı tablonun üstünde gösterir. |
selectable | boolean | false | Bir checkbox kolonu ekler. |
getRowLabel | (row) => string | – | Satırı checkbox etiketinde adlandırır. Varsayılanı ilk görünür kolon. |
searchable | boolean | true | Arama kutusunu gösterir. |
columnToggle | boolean | gizlenebilir kolon varsa true | Kolonlar menüsünü gösterir. |
paginated | boolean | birden çok sayfa varsa true | Sayfalamayı gösterir. |
pageSizeOptions | number[] | – | Sayfa başına satır seçimi sunar. |
toolbar | ReactNode | – | Araç satırındaki ek kontroller. |
emptyState | ReactNode | labels.empty | Hiçbir satır eşleşmediğinde gösterilir. |
labels | Partial<DataTableLabels> | – | Görünen ve ekran okuyucuya giden her metin; varsayılanlar İngilizce. |
rootClassName | string | – | Dış sarmalayıcının sınıfı. |
DataTableLabels: search, searchPlaceholder, columns, selectPage, selectRow(rowLabel), selected(count, total), results(count), empty, rowsPerPage, pagination, previousPage, nextPage, page(n).
Stil verme
| Sınıf | Eleman |
|---|---|
.mrd-data-table | Sarmalayıcı |
.mrd-data-table__toolbar, .mrd-data-table__search, .mrd-data-table__columns | Araç satırı parçaları |
.mrd-data-table__select | Checkbox hücreleri |
.mrd-data-table__empty | Boş satır hücresi |
.mrd-data-table__footer, .mrd-data-table__status, .mrd-data-table__page-size | Alt bilgi parçaları |
Satırlar, başlıklar ve hücreler Table'ın kendi sınıflarıdır (.mrd-table__*); seçili satırlar data-selected alır.
Erişilebilirlik
Tablo, bir <caption> ile native tablo semantiğini korur. Sıralanabilir başlıklar <th aria-sort> içindeki butonlardır; her checkbox'ın bir adı vardır ("Ada Lovelace satırını seç", "Bu sayfadaki tüm satırları seç") ve başlık checkbox'ı karışık state'i gösterir. Durum satırı, aramadan sonra sonuç sayısını ve seçim sayısını okuyan polite bir live region'dır; arama kutusu onunla açıklanır.
| Tuş | Ne yapar |
|---|---|
| Tab | Arama, Kolonlar, sıralama butonları, checkbox'lar ve sayfalama arasında ilerler. |
| EnterSpace | Sıralama butonunda: artan, azalan, sırasız arasında döner. |
| Space | Checkbox'ta: satırı (ya da sayfayı) seçer veya seçimi kaldırır. |
Kullanım ilkeleri
Yap
Sayıları sağa hizala (`align: "end"`) ve ad kolonunu hep görünür tut (`hideable: false`).
Kaçın
Hook'a binlerce satır yüklemek. Sayfalamayı ve sıralamayı sunucuda yap, onun yerine Table render'la.
İlgili sayfalar
- Table: DataTable'ın üzerine kurulduğu markup.
- Veri tabloları deseni: yerleşim ve toplu aksiyonlar.
- Pagination: alt bilgideki kontrol.