Data Table
Tabla, filtro, selector de columnas, paginación y selección de filas en una sola pieza. Ordenar, filtrar y paginar corren en React plano sobre las filas que le pasás.
| INV-1042 | Acme Corpbilling@acmecorp.com | paid | $250.00 | |
| INV-1043 | Globexbilling@globex.com | pending | $981.00 | |
| INV-1044 | Initechbilling@initech.com | overdue | $1,712.00 | |
| INV-1045 | Umbrellabilling@umbrella.com | paid | $2,443.00 | |
| INV-1046 | Hoolibilling@hooli.com | pending | $3,174.00 | |
| INV-1047 | Vehement Capitalbilling@vehementcapital.com | overdue | $3,905.00 |
0 of 23 selected
Page 1 of 4
Instalación
pnpm dlx nachui add data-tableAnatomía
Sin children la tabla se arma sola: el filtro y el selector de columnas arriba, la tabla en el medio, el conteo de seleccionadas y el paginador abajo. Todo corre sobre el array que le pasás, así que no hay fetch, ni adaptador, ni librería debajo.
Pasale children para quedarte solo con las partes que querés. Todas leen el mismo contexto, así que una tabla sola sigue filtrando, ordenando y paginando con lo que conectes a
useDataTable.Composición
Un hybrid es composición visible. Abrí
data-table.tsx y estos son los elements que lo forman, en este orden:Forma de una columna
Una columna dice cómo leer la fila y cómo mostrarla.
cell renderiza, sortValue y filterValue son lo que comparan el orden y el filtro. Si una columna no tiene filterValue, la tabla usa sortValue, y si tampoco, la celda cuando es texto plano.| Campo | Tipo | Descripción |
|---|---|---|
id | string | Clave estable, también el nombre en sort |
header | ReactNode | Celda de cabecera, y etiqueta en el menú de columnas |
cell | (row: T) => ReactNode | Celda del cuerpo |
sortable | boolean | Convierte la cabecera en un botón de orden |
sortValue | (row: T) => string | number | Date | Valor que se compara al ordenar |
filterValue | (row: T) => string | Texto que busca el filtro |
align | 'start' | 'end' | end alinea a la derecha y usa números tabulares |
hidden | boolean | Oculta al inicio, sigue disponible en el menú |
width | string | Cualquier ancho CSS para la cabecera |
Orden
Hacé clic en una cabecera ordenable para ordenar ascendente, otra vez para descendente, y una tercera para limpiar. El orden es estable, así que las filas empatadas mantienen el orden en que llegaron. La cabecera lleva
aria-sort para tecnología asistiva.Selección
Con
selectable aparece la columna de checkboxes. El de la cabecera selecciona la página actual, y queda indeterminado cuando solo hay parte seleccionada. La selección es un set de ids de getRowId, así que sobrevive al orden, al filtro y al paginado. Leela con onSelectedChange o controlala con selected.Estado controlado
Filtro, orden y selección son no controlados por defecto. Pasá
filter, sort o selected con sus handlers para manejarlos vos, para una URL, un store o una query al servidor. El helper puro applyDataTable es lo que corre el componente, así que podés correr la misma lógica en otro lado.Compacta
Quedate solo con la tabla cuando la barra y el pie serían ruido.
| Version | Date | Changes |
|---|---|---|
| 1.4.0 | 2026-09-18 | 12 |
| 1.3.2 | 2026-09-02 | 3 |
| 1.3.1 | 2026-08-27 | 1 |
| 1.3.0 | 2026-08-20 | 9 |
| 1.2.0 | 2026-07-30 | 15 |
Referencia de API
DataTable
| Prop | Tipo | Por defecto | Descripción |
|---|---|---|---|
data | T[] | - | Todas las filas, antes de filtrar y paginar |
columns | DataTableColumn<T>[] | - | Definición de columnas |
getRowId | (row: T) => string | - | Id estable por fila, para keys y selección |
pageSize | number | 10 | Filas por página |
selectable | boolean | false | Agrega la columna de checkboxes |
selected | Set<string> | string[] | - | Selección controlada |
onSelectedChange | (selected: string[]) => void | - | Se llama cuando cambia la selección |
sort | { id, direction } | null | - | Orden controlado |
onSortChange | (sort) => void | - | Se llama cuando cambia el orden |
filter | string | - | Texto del filtro controlado |
onFilterChange | (filter: string) => void | - | Se llama cuando cambia el filtro |
filterPlaceholder | string | 'Filter…' | Placeholder del input de filtro |
emptyTitle | string | 'No results' | Título del estado vacío |
emptyDescription | string | - | Descripción del estado vacío |
labels | Partial<DataTableLabels> | - | Todos los textos visibles, con defaults en inglés |
children | ReactNode | - | Layout propio, reemplaza las partes por defecto |
className | string | - | Clases CSS adicionales |
DataTable.Toolbar
| Prop | Tipo | Por defecto | Descripción |
|---|---|---|---|
children | ReactNode | - | Acciones extra al lado del filtro |
className | string | - | Clases CSS adicionales |
DataTable.Content
| Prop | Tipo | Por defecto | Descripción |
|---|---|---|---|
className | string | - | Clases CSS adicionales |
DataTable.Footer
| Prop | Tipo | Por defecto | Descripción |
|---|---|---|---|
children | ReactNode | - | Contenido extra al lado del conteo |
className | string | - | Clases CSS adicionales |
Helpers
| Firma | Descripción |
|---|---|
applyDataTable(data, { columns, filter, sort, page, pageSize }) | Devuelve { rows, total, pageCount }, la misma lógica que corre la tabla |
useDataTable() | El contexto de la tabla, para partes propias dentro de DataTable |
¿Encontraste algo que mejorar?
¿Notaste un error, tipografía o detalle faltante en esta página? Ayúdanos a mejorar la documentación abriendo un issue en GitHub.