Data table
Gerçek veriler için bir tablo; sıralama, arama, satır seçimi, sabitlenmiş sütunlar, yapışkan başlık ve sayfalama içerir.
| Method | Country | |||||
|---|---|---|---|---|---|---|
| [email protected] | Card | United States | 2026-01-01 | $5.00 | ||
| [email protected] | PayPal | Japan | 2026-02-02 | $84.20 | ||
| [email protected] | Bank | Germany | 2026-03-03 | $163.40 | ||
| [email protected] | Apple Pay | Brazil | 2026-04-04 | $242.60 | ||
| [email protected] | Card | India | 2026-05-05 | $321.80 | ||
| [email protected] | PayPal | United States | 2026-06-06 | $401.00 | ||
| [email protected] | Bank | Japan | 2026-07-07 | $480.10 | ||
| [email protected] | Apple Pay | Germany | 2026-08-08 | $559.30 | ||
| [email protected] | Card | Brazil | 2026-09-09 | $638.50 | ||
| [email protected] | PayPal | India | 2026-01-10 | $717.70 |
pnpm dlx shadcn@latest add https://hextaui.com/r/data-table.jsonBileşeni, HextaUI tema token'larını ve bileşenin bağımlı olduğu tüm HextaUI bileşenlerini ekler.
Henüz eklemediyseniz tema token'larını global CSS'inize ekleyin.
Bağımlılıkları yükleyin.
pnpm add @base-ui/react @tabler/icons-react @tanstack/react-table class-variance-authority cnAşağıdaki kodu kopyalayıp projenize yapıştırın.
components/ui/data-table.tsx components/ui/table.tsx components/ui/button.tsx components/ui/checkbox.tsx components/ui/skeleton.tsx İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Data table, sıralama, filtreleme, sayfalama, seçim ve sütun görünürlüğü özellikleri hazır bağlanmış TanStack Table v9'dur. Sütunları createDataTableColumns ile bir kez tanımlayın, tabloyu useDataTable ile oluşturun, sonra ihtiyaç duyduğunuz parçaları birleştirin.
Sahip olmak istediğiniz herhangi bir TanStack state'ini, örneğin sıralama veya satır seçimini, değişim işleyicisiyle birlikte geçin.
DataTableColumnHeader, DataTableSelectAll ve DataTableSelectRow, bir sütunun başlığı veya hücresi olarak sütun tanımlarınıza girer.
Düz tablo
Data table'ın üzerine kurulduğu düz <Table /> parçaları. Statik veri için bir başlık ve alt toplamla tek başlarına kullanın.
Yükleniyor
loading ile skeleton satırlar gerçek satırlarla aynı alanı doldurur; böylece veri geldiğinde hiçbir şey zıplamaz. Bu sırada tablo aria-busy olarak işaretlenir.
Empty
emptyMessage, veri olmadığında veya hiçbir şey aramayla eşleşmediğinde gövdeyi doldurur.
Yapışkan başlık
containerClassName ile kapsayıcıya azami bir yükseklik verin ve stickyHeader ayarlayın. Başlık yerinde kalır ve satırlar altından kaydığında ince bir çizgi kazanır. Checkbox'lar üzerinde Shift ile sürüklemek, kenarına yaklaştıkça kutuyu kaydırır.
Sabitlenmiş sütunlar
Seçim sütunu ve ilk veri sütunu varsayılan olarak sabitlenir. Kendinizinkini pinStart ile seçin. Tablo yana kaydığında kenarı yumuşak bir gölge işaretler.
Sağdan sola
Her etiket ve sayı labels ve biçim fonksiyonlarıyla değiştirilebilir. Sayfalama okları ve sabitlenmiş sütunlar yönle birlikte ters döner.
- Artan sıralamak için sıralanabilir bir başlığa tıklayın, azalan için tekrar, temizlemek için üçüncü kez tıklayın. İkincil bir sıralama eklemek için başka bir başlığa Shift ile tıklayın.
- Bir satır checkbox'ına Shift ile tıklamak, onunla en son tıkladığınız arasındaki her satırı seçer. Bir aralığı tek harekette seçmek veya temizlemek için Shift'e basılı tutup checkbox'lar üzerinde sürükleyin.
- Arama, seçim sütunu hariç tüm sütunlarla eşleşir ve ilk sayfaya döner.
- Sütunları View menüsünden gizlemek menüyü açık tutar; böylece birkaçını aynı anda açıp kapatabilirsiniz.
| Tuş | Action |
|---|---|
| Tab | Arama, View menüsü, sıralanabilir başlıklar, satır checkbox'ları ve sayfalama arasında gezinir. |
| EnterSpace | Odaktaki başlığa göre sıralar. |
| Space | Odaktaki checkbox'ı açıp kapatır. |
| Esc | Metin varsa aramayı temizler. |
- Sıralanabilir başlıklar
aria-sorttaşır ve kibar (polite) bir canlı bölge yeni sıralamayı, yazdıktan kısa süre sonra da sonuç sayısını duyurur. - Sayfa göstergesi bir canlı bölgedir; böylece ekran okuyucular next veya previous'a bastıktan sonra yeni sayfayı duyar.
- Checkbox'ların varsayılan olarak etiketleri vardır.
<DataTableSelectAll />ve<DataTableSelectRow />üzerindearia-labelile geçersiz kılın.
Aşağıdaki her parça, tabloyu onlarla paylaşan <DataTable /> içinde render edilmelidir.
TanStack Table seçeneklerini alır ve tabloyu döndürür. initialState.pagination aksini söylemedikçe sayfalar 10 satır tutar.
| Prop | Tür | Varsayılan |
|---|---|---|
data | TData[] | – |
columnsBunları createDataTableColumns ile oluşturun. | ColumnDef[] | – |
getRowIdSatırlar hareket ettiğinde seçimi kararlı tutar. Varsayılan olarak satır dizinidir. | (row: TData) => string | – |
initialState | Partial<TableState> | { pagination: { pageIndex: 0, pageSize: 10 } } |
statesorting, rowSelection, globalFilter, pagination veya columnVisibility'yi kontrol edin. | Partial<TableState> | – |
onSortingChangeKontrol edilebilir her state'in, onRowSelectionChange gibi eşleşen bir işleyicisi vardır. | OnChangeFn<SortingState> | – |
enableRowSelection | boolean | (row) => boolean | true |
accessor, display ve columns içeren tipli bir sütun yardımcısı döndürür. Başlığı ve hücreleri hizalamak için sayısal sütunlarda meta: { align: "end" } ayarlayın.
| Prop | Tür | Varsayılan |
|---|---|---|
tableuseDataTable'ın döndürdüğü tablo. | DataTableInstance<TData> | – |
className | string | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="data-table" | Her parçanın çevresindeki sarmalayıcı. |
data-slot="data-table-announcer" | Görsel olarak gizli canlı bölge. |
| Prop | Tür | Varsayılan |
|---|---|---|
emptyMessage | ReactNode | "No results." |
loading | boolean | false |
loadingRowsYükleme sırasındaki skeleton satır sayısı. | number | 5 |
pinStartBaşlangıç kenarına sabitlenecek sütun id'leri. | string[] | ["select", firstColumnId] |
stickyHeaderKapsayıcıda azami bir yükseklik gerekir. | boolean | false |
containerClassNameKaydırma kapsayıcısına uygulanır. | string | – |
swipeSelectBir aralığı seçmek için checkbox'lar üzerinde Shift ile sürükleyin. | boolean | true |
classNameTablo öğesine uygulanır. | string | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="table-container" | Kaydırma kapsayıcısı. |
data-scrolled-start | Başlangıç kenarından uzaklaşıldığında kapsayıcıda bulunur. |
data-scrolled-end | Son kenara doğru kaydırılacak daha fazla şey olduğunda bulunur. |
data-scrolled-top | Satırlar dikey kaydırıldıktan sonra bulunur. |
data-swipe-selecting | Shift ile sürükleme sırasında kapsayıcıda bulunur. |
data-state="selected" | Seçili satırlarda bulunur. |
data-row-id | getRowId'den gelen satır id'si. |
data-slot="data-table-loading-row" | Her skeleton satırı. |
data-slot="data-table-empty" | Boş satır. |
Arama, View menüsü ve kendi filtreleriniz için sarmalayan bir satır. Tüm div prop'larını kabul eder ve data-slot olarak data-table-toolbar taşır.
| Prop | Tür | Varsayılan |
|---|---|---|
placeholder | string | "Search…" |
aria-label | string | "Search table" |
clearLabelTemizle düğmesinin erişilebilir adı. | string | "Clear search" |
| Öznitelik | Açıklama |
|---|---|
data-slot="data-table-search" | Arama alanı sarmalayıcısı. |
| Prop | Tür | Varsayılan |
|---|---|---|
label | string | "View" |
groupLabel | string | "Toggle columns" |
getLabelVarsayılan olarak sütunun string başlığıdır veya baş harfi büyük id'sidir. | (column) => string | – |
Gizlenebilen her sütunu listeler. Bir sütunu dışarıda bırakmak için üzerinde enableHiding: false ayarlayın.
| Öznitelik | Açıklama |
|---|---|
data-slot="data-table-view-options" | Menü popup'ı. |
| Prop | Tür | Varsayılan |
|---|---|---|
column | Column | – |
title | string | – |
Sıralanabilir sütunlar için bir sıralama düğmesi, diğerleri için düz metin render eder.
| Öznitelik | Açıklama |
|---|---|
data-slot="data-table-column-header" | Başlık sarmalayıcısı. |
data-sorted | Sütun sıralıyken sıralama düğmesinde bulunur. |
aria-sort | Başlık hücresinde: artan, azalan veya yok. |
| Prop | Tür | Varsayılan |
|---|---|---|
table | Table | – |
aria-label | string | "Select all rows on this page" |
Geçerli sayfadaki satırları seçer ve yalnızca bazıları seçiliyken belirsiz (indeterminate) bir durum gösterir.
| Prop | Tür | Varsayılan |
|---|---|---|
row | Row | – |
aria-label | string | "Select row" |
| Prop | Tür | Varsayılan |
|---|---|---|
pageSizes | number[] | [10, 20, 50, 100] |
showSelectionSatır sayısı yerine seçili sayıyı gösterin. | boolean | true |
labelsrowsPerPage, firstPage, previousPage, nextPage ve lastPage. | Partial<DataTablePaginationLabels> | – |
formatSelection | (selected: number, total: number) => ReactNode | "2 of 42 rows selected" |
formatRows | (total: number) => ReactNode | "42 rows" |
formatPage | (page: number, pageCount: number) => ReactNode | "Page 1 of 5" |
| Öznitelik | Açıklama |
|---|---|
data-slot="data-table-pagination" | Sayfalama çubuğu. |
En yakın <DataTable /> bileşeninden tabloyu döndürür. Bir durum filtresi gibi kendi araç çubuğu kontrollerinizi oluşturmak için kullanın.
| Prop | Tür | Varsayılan |
|---|---|---|
stickyHeaderBaşlık satırını kayan bir kapsayıcının içinde sabitler. | boolean | false |
containerClassNameKaydırma kapsayıcısına uygulanır. | string | – |
containerRef | Ref<HTMLDivElement> | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="table" | Tablo öğesi. |
data-sticky-header | stickyHeader açıkken kapsayıcıda bulunur. |
--table-bg | Satır ve sabitlenmiş hücre arka planı. İçinde bulunduğu kartı veya popover'ı izler. |
| Prop | Tür | Varsayılan |
|---|---|---|
alignSona hizalı hücreler de tabular rakamlar kullanır. | "start" | "center" | "end" | "start" |
pinnedTablo yana kayarken hücreyi yerinde tutar. --pin-offset ile kaydırın. | "start" | "end" | – |
pinnedEdgeKaydırılırken son sabitlenmiş sütunda yumuşak bir gölge çizer. | boolean | false |
| Öznitelik | Açıklama |
|---|---|
data-align | Geçerli hizalama. |
data-pinned | Sabitlendiğinde start veya end. |
data-pinned-edge | Bir tarafın son sabitlenmiş hücresinde bulunur. |
--pin-offset | Sabitlenen kenardan uzaklık; sizin için ayarlanır. |
TableHeader, TableBody, TableFooter, TableRow ve TableCaption eşleşen tablo öğelerini render eder ve onların tüm prop'larını kabul eder.
- ButtonHer varyant ve boyutta düğmeler; hızlı istekler için spinner'ı atlayan yerleşik yükleme, başarı ve hata akışı.
- Checkboxİşareti çizilerek beliren, belirsiz üst öğeleri, grupları ve hover durumunu paylaşan etiketleri olan bir onay kutusu.
- SkeletonGöstermeden önce 150ms bekleyen, sardıkları içeriğin tam boyutunu alan ve hiçbir şeyi kaydırmadan içeriği yumuşakça görünür kılan yer tutucular.
- TableYüzey stili, sarmalayan veya kompakt hücreler, yapışkan başlıklar, sabitlenmiş sütunlar ve kaydırma ipuçları olan duyarlı bir tablo.
- AvatarBaş harf yedekli kullanıcı fotoğrafları, durum rozetleri ve sayıya daralan yığılmış gruplar.
- BadgeRenkli noktalı durum etiketleri, kayarak kapanan kaldırılabilir etiketler ve yeni değerine dönen sayaçlar.