DataTable

Tabla con API progresiva de 3 capas. Usa solo lo que necesitas: desde JSON puro hasta compound components con render functions completas.

pnpm dlx nuvo-ui add data-table

Capa 1 — JSON puro

El 90% de las tablas. Define columnas con key + label. Sin JSX adicional.

NombreEmailRol
Ana Garcíaana@empresa.comAdmin
Carlos Lópezcarlos@empresa.comEditor
María Torresmaria@empresa.comViewer
Luis Martínezluis@empresa.comEditor
Sara Ruizsara@empresa.comViewer
Pedro Sanzpedro@empresa.comAdmin
<DataTable
  data={users}
  columns={[
    { key: "name",  label: "Nombre" },
    { key: "email", label: "Email" },
    { key: "role",  label: "Rol" },
  ]}
/>

Capa 2 — JSON + render()

Añade render functions solo donde necesitas personalizar una celda. Sorting y búsqueda incluidos.

NombreEmailRolEstado
Ana Garcíaana@empresa.comAdminActivo
Carlos Lópezcarlos@empresa.comEditorInactivo
María Torresmaria@empresa.comViewerActivo
Luis Martínezluis@empresa.comEditorActivo
Sara Ruizsara@empresa.comViewerActivo
Pedro Sanzpedro@empresa.comAdminInactivo
<DataTable
  data={users}
  searchable
  columns={[
    { key: "name",   label: "Nombre", sortable: true },
    { key: "email",  label: "Email" },
    {
      key: "status",
      label: "Estado",
      render: (value) => (
        <Badge variant={value === "active" ? "success" : "muted"} dot size="sm">
          {value === "active" ? "Activo" : "Inactivo"}
        </Badge>
      ),
    },
    {
      key: "id",
      label: "",
      render: (_, row) => (
        <Button variant="ghost" size="sm" onClick={() => handleView(row)}>
          Ver
        </Button>
      ),
    },
  ]}
/>

Capa 3 — Compound components

Control total. DataTable.Column acepta una función render como children. Soporta paginación.

NombreRolEstado
Ana Garcíaana@empresa.com
AdminActivo
Carlos Lópezcarlos@empresa.com
EditorInactivo
María Torresmaria@empresa.com
ViewerActivo
Página 1 de 2
<DataTable data={users} paginate pageSize={10}>
  <DataTable.Column columnKey="name" label="Nombre" sortable>
    {({ value, row }) => (
      <div className="flex flex-col">
        <span className="font-medium">{row.name}</span>
        <span className="text-xs text-muted-foreground">{row.email}</span>
      </div>
    )}
  </DataTable.Column>
  <DataTable.Column columnKey="status" label="Estado">
    {({ value }) => (
      <Badge variant={value === "active" ? "success" : "muted"} dot size="sm">
        {value}
      </Badge>
    )}
  </DataTable.Column>
</DataTable>
Nota: La paginación, el sorting y la búsqueda global son opcionales y se pueden combinar en cualquier capa.

Props

PropTipoDefaultDescripción
dataT[]Array de datos a mostrar
columnsColumnDef<T>[]Definición de columnas (Capas 1 y 2)
childrenReactNodeDataTable.Column para Capa 3
searchablebooleanfalseMuestra input de búsqueda global
paginatebooleanfalseActiva paginación con controles
pageSizenumber10Filas por página
loadingbooleanfalseMuestra skeleton de carga
emptyTextstring"Sin datos."Texto cuando no hay resultados
PropTipoDefaultDescripción
keystringCampo del objeto de datos
labelstringTítulo de la columna
sortablebooleanfalsePermite ordenar al hacer click
render(value, row, index) => ReactNodeRender function de la celda (Capa 2)