Hook simple para crear tablas. Define tus columnas y datos, y obtén todo listo para renderizar.
Convierte tus datos y definiciones de columnas en encabezados y filas listos para renderizar. Sin escribir <th> y <td> manualmente.
import { useTable } from "@blifedesarrollo/hooks";| ID | Nombre | Departamento | Salario | |
|---|---|---|---|---|
| 1 | Juan Pérez | juan@email.com | Ingeniería | 5000 |
| 2 | María García | maria@email.com | Diseño | 4500 |
| 3 | Carlos López | carlos@email.com | Marketing | 4200 |
| 4 | Ana Rodríguez | ana@email.com | Ventas | 4800 |
const data = [
{ id: 1, nombre: "Juan", edad: 25 },
{ id: 2, nombre: "Ana", edad: 30 },
];const columns = [
{
id: "nombre",
header: "Nombre",
accessorKey: "nombre", // ← Campo del objeto a mostrar
},
{
id: "edad",
header: "Edad",
accessorKey: "edad",
},
];const { headers, rows } = useTable({ data, columns });
return (
<Table>
<TableHeader>
<TableRow>
{headers.map((header) => (
<TableHead key={header.id}>{header.renderHeader()}</TableHead>
))}
</TableRow>
</TableHeader>
<TableBody>
{rows.map((row) => (
<TableRow key={row.id}>
{row.cells().map((cell) => (
<TableCell key={cell.id}>{cell.renderCell()}</TableCell>
))}
</TableRow>
))}
</TableBody>
</Table>
);accessorKey - Para texto planoÚsalo solo cuando quieres mostrar el valor directamente como texto:
{
id: "nombre",
header: "Nombre",
accessorKey: "nombre", // ← Muestra el valor como texto plano
}Importante: accessorKey sin cell solo muestra texto plano. Si necesitas formatear, usar componentes React o personalizar el renderizado, debes usar cell.
cell - Para personalizar el renderizadoUsa cell cuando necesitas:
// Con accessorKey + cell → usa getValue()
{
id: "precio",
header: "Precio",
accessorKey: "precio", // ← Extrae el valor
cell: ({ getValue }) => {
const precio = getValue(); // ← Obtiene el valor extraído
return `$${precio.toFixed(2)}`; // ← Lo formateas
},
}// Sin accessorKey → usa row.data
{
id: "acciones",
header: "Acciones",
// Sin accessorKey - no hay campo específico
cell: ({ row }) => (
<button onClick={() => edit(row.data.id)}>Editar</button>
),
}Resumen:
accessorKey → Muestra texto planoaccessorKey + cell → Personalizas el valor extraídocell → Accedes a row.data completo{
id: "nombre",
header: "Nombre",
accessorKey: "nombre", // ← Muestra directamente el texto
}{
id: "fecha",
header: "Fecha",
accessorKey: "fechaLanzamiento", // ← Extrae el valor
cell: ({ getValue }) => {
// getValue() retorna el valor de accessorKey
return new Date(getValue()).toLocaleDateString("es-ES");
},
}{
id: "acciones",
header: "Acciones",
// Sin accessorKey - no hay campo específico
cell: ({ row }) => (
<div className="flex gap-2">
<button onClick={() => handleEdit(row.data)}>Editar</button>
<button onClick={() => handleDelete(row.data.id)}>Eliminar</button>
</div>
),
}{
id: "nombreCompleto",
header: "Nombre Completo",
// Sin accessorKey - necesitas múltiples campos
cell: ({ row }) => {
const { nombre, apellido } = row.data;
return <span>{`${nombre} ${apellido}`}</span>;
},
}{
id: "nombre",
header: () => (
<div className="flex items-center gap-2">
<Icon />
<span>Nombre</span>
</div>
),
accessorKey: "nombre",
}| Prop | Tipo | Descripción |
|---|---|---|
data | Array<Object> | Array de objetos (filas de la tabla) |
columns | Array<Object> | Definición de columnas |
| Prop | Tipo | Descripción |
|---|---|---|
id | string | Identificador único (requerido) |
header | string | ReactNode | () => ReactNode | Contenido del encabezado |
accessorKey | string | Campo del objeto a mostrar como texto plano (opcional) |
cell | (params) => ReactNode | Función para personalizar el renderizado de la celda (opcional, requiere cell) |
| Prop | Tipo | Descripción |
|---|---|---|
headers | Array<Object> | Encabezados con renderHeader() |
rows | Array<Object> | Filas con cells() y data |
accessorKey (sin cell)accessorKey + cell con getValue()cell con row.data