APIs de Filtrado de Columnas
Puede Filtrar
La capacidad de una columna para ser filtrada por columna se determina por lo siguiente:
- La columna se definió con un
accessorKey/accessorFnválido. column.enableColumnFilterno está configurado comofalseoptions.enableColumnFiltersno está configurado comofalseoptions.enableFiltersno está configurado comofalse
Estado
El estado del filtro se almacena en la tabla usando la siguiente estructura:
export interface ColumnFiltersTableState {
columnFilters: ColumnFiltersState;
}
export type ColumnFiltersState = ColumnFilter[];
export interface ColumnFilter {
id: string;
value: unknown;
}
Funciones de Filtro
Las siguientes funciones de filtro están integradas en el núcleo de la tabla:
includesString- Inclusión de cadena sin distinción entre mayúsculas y minúsculas
includesStringSensitive- Inclusión de cadena con distinción entre mayúsculas y minúsculas
equalsString- Igualdad de cadena sin distinción entre mayúsculas y minúsculas
equalsStringSensitive- Igualdad de cadena con distinción entre mayúsculas y minúsculas
arrIncludes- Inclusión de elemento dentro de un array
arrIncludesAll- Todos los elementos incluidos en un array
arrIncludesSome- Algunos elementos incluidos en un array
equals- Igualdad de objeto/referencial
Object.is/===
- Igualdad de objeto/referencial
weakEquals- Igualdad de objeto/referencial débil
==
- Igualdad de objeto/referencial débil
inNumberRange- Inclusión en rango numérico
Cada función de filtro recibe:
- La fila a filtrar
- El columnId a usar para recuperar el valor de la fila
- El valor del filtro
y debería devolver true si la fila debe incluirse en las filas filtradas, y false si debe eliminarse.
Esta es la firma de tipo para cada función de filtro:
export type FilterFn<TData extends AnyData> = {
(
row: Row<TData>,
columnId: string,
filterValue: any,
addMeta: (meta: any) => void,
): boolean;
resolveFilterValue?: TransformFilterValueFn<TData>;
autoRemove?: ColumnFilterAutoRemoveTestFn<TData>;
addMeta?: (meta?: any) => void;
};
export type TransformFilterValueFn<TData extends AnyData> = (
value: any,
column?: Column<TData>,
) => unknown;
export type ColumnFilterAutoRemoveTestFn<TData extends AnyData> = (
value: any,
column?: Column<TData>,
) => boolean;
export type CustomFilterFns<TData extends AnyData> = Record<
string,
FilterFn<TData>
>;
filterFn.resolveFilterValue
Este método opcional "colgante" en cualquier filterFn permite que la función de filtro transforme/sanee/formatee el valor del filtro antes de que se pase a la función de filtro.
filterFn.autoRemove
Este método opcional "colgante" en cualquier filterFn recibe un valor de filtro y se espera que devuelva true si el valor del filtro debe eliminarse del estado del filtro. Por ejemplo, algunos filtros de estilo booleano pueden querer eliminar el valor del filtro del estado de la tabla si el valor del filtro se establece en false.
Uso de las Funciones de Filtro
Las funciones de filtro pueden usarse/referenciarse/definirse pasando lo siguiente a columnDefinition.filterFn:
- Una
stringque hace referencia a una función de filtro integrada - Una función proporcionada directamente a la opción
columnDefinition.filterFn
La lista final de funciones de filtro disponibles para la opción columnDef.filterFn usa el siguiente tipo:
export type FilterFnOption<TData extends AnyData> =
| "auto"
| BuiltInFilterFn
| FilterFn<TData>;
Meta del Filtro
El filtrado de datos a menudo puede exponer información adicional sobre los datos que se puede utilizar para ayudar a otras operaciones futuras sobre los mismos datos. Un buen ejemplo de este concepto es un sistema de clasificación como el de match-sorter que simultáneamente clasifica, filtra y ordena datos. Si bien las utilidades como match-sorter tienen mucho sentido para tareas de filtro+ordenación unidimensionales, la arquitectura de filtrado/ordenación desacoplada de la construcción de una tabla las hace muy difíciles y lentas de usar.
Para que un sistema de clasificación/filtrado/ordenación funcione con tablas, las filterFns pueden, opcionalmente, marcar los resultados con un valor filter meta que puede usarse más tarde para ordenar/agrupar/etc. los datos a tu gusto. Esto se hace llamando a la función addMeta proporcionada a tu filterFn personalizado.
A continuación se muestra un ejemplo utilizando nuestro propio paquete match-sorter-utils (una bifurcación de utilidad de match-sorter) para clasificar, filtrar y ordenar los datos.
import { sortingFns } from "@tanstack/react-table";
import { rankItem, compareItems } from "@tanstack/match-sorter-utils";
const fuzzyFilter = (row, columnId, value, addMeta) => {
// Clasificar el elemento
const itemRank = rankItem(row.getValue(columnId), value);
// Almacenar la información de clasificación
addMeta(itemRank);
// Devolver si el elemento debe ser filtrado (incluido/excluido)
return itemRank.passed;
};
const fuzzySort = (rowA, rowB, columnId) => {
let dir = 0;
// Solo ordenar por clasificación si la columna tiene información de clasificación
if (rowA.columnFiltersMeta[columnId]) {
dir = compareItems(
rowA.columnFiltersMeta[columnId]!,
rowB.columnFiltersMeta[columnId]!,
);
}
// Proporcionar un respaldo alfanumérico para cuando las clasificaciones de los elementos sean iguales
return dir === 0 ? sortingFns.alphanumeric(rowA, rowB, columnId) : dir;
};
Opciones de Definición de Columna
filterFn
filterFn?: FilterFn | keyof FilterFns | keyof BuiltInFilterFns
La función de filtro a usar con esta columna.
Opciones:
- Una
stringque hace referencia a una función de filtro integrada) - Una función de filtro personalizada
enableColumnFilter
enableColumnFilter?: boolean
Habilita/deshabilita el filtro de columna para esta columna.
API de Columna
getCanFilter
getCanFilter: () => boolean;
Devuelve si la columna puede o no ser filtrada por columna.
getFilterIndex
getFilterIndex: () => number;
Devuelve el índice (incluyendo -1) del filtro de columna en el array state.columnFilters de la tabla.
getIsFiltered
getIsFiltered: () => boolean;
Devuelve si la columna está actualmente filtrada o no.
getFilterValue
getFilterValue: () => unknown;
Devuelve el valor de filtro actual de la columna.
setFilterValue
setFilterValue: (updater: Updater<any>) => void
Una función que establece el valor de filtro actual para la columna. Puedes pasarle un valor o una función updater para operaciones seguras de inmutabilidad sobre valores existentes.
getAutoFilterFn
getAutoFilterFn: (columnId: string) => FilterFn<TData> | undefined;
Devuelve una función de filtro calculada automáticamente para la columna basándose en el primer valor conocido de la columna.
getFilterFn
getFilterFn: (columnId: string) => FilterFn<TData> | undefined;
Devuelve la función de filtro (ya sea definida por el usuario o automática, dependiendo de la configuración) para el columnId especificado.
API de Fila
columnFilters
columnFilters: Record<string, boolean>;
El mapa de filtros de columna para la fila. Este objeto rastrea si una fila pasa/falla filtros específicos por su ID de columna.
columnFiltersMeta
columnFiltersMeta: Record<string, any>;
El mapa de metadatos de filtros de columna para la fila. Este objeto rastrea cualquier metadato de filtro para una fila, según se proporcione opcionalmente durante el proceso de filtrado.
Opciones de Tabla
filterFns
filterFns?: Record<string, FilterFn>
Esta opción te permite definir funciones de filtro personalizadas que pueden ser referenciadas en la opción filterFn de una columna por su clave.
Ejemplo:
declare module "@tanstack/[adapter]-table" {
interface FilterFns {
myCustomFilter: FilterFn<unknown>;
}
}
const column = columnHelper.data("key", {
filterFn: "myCustomFilter",
});
const table = useReactTable({
columns: [column],
filterFns: {
myCustomFilter: (rows, columnIds, filterValue) => {
// devolver las filas filtradas
},
},
});
filterFromLeafRows
filterFromLeafRows?: boolean
Por defecto, el filtrado se realiza desde las filas padre hacia abajo (es decir, si una fila padre se filtra, todos sus hijos también se filtrarán). Configurar esta opción como true hará que el filtrado se realice desde las filas hoja hacia arriba (lo que significa que las filas padre se incluirán siempre que una de sus filas hijas o nietas también esté incluida).
maxLeafRowFilterDepth
maxLeafRowFilterDepth?: number
Por defecto, el filtrado se realiza para todas las filas (profundidad máxima de 100), sin importar si son filas padre de nivel raíz o las filas hoja hijas de una fila padre. Configurar esta opción en 0 hará que el filtrado se aplique solo a las filas padre de nivel raíz, quedando todas las subfilas sin filtrar. De manera similar, configurar esta opción en 1 hará que el filtrado se aplique solo a las filas hoja hijas de 1 nivel de profundidad, y así sucesivamente.
Esto es útil para situaciones en las que deseas que toda la jerarquía de hijos de una fila sea visible independientemente del filtro aplicado.
enableFilters
enableFilters?: boolean
Habilita/deshabilita todos los filtros para la tabla.
manualFiltering
manualFiltering?: boolean
Deshabilita el uso de getFilteredRowModel para filtrar datos. Esto puede ser útil si tu tabla necesita soportar dinámicamente tanto el filtrado del lado del cliente como del lado del servidor.
onColumnFiltersChange
onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>
Si se proporciona, esta función será llamada con un updaterFn cuando state.columnFilters cambie. Esto anula la gestión de estado interna predeterminada, por lo que deberás persistir el cambio de estado de forma total o parcial fuera de la tabla.
enableColumnFilters
enableColumnFilters?: boolean
Habilita/deshabilita todos los filtros de columna para la tabla.
getFilteredRowModel
getFilteredRowModel?: (
table: Table<TData>
) => () => RowModel<TData>
Si se proporciona, esta función se llama una vez por tabla y debe devolver una nueva función que calculará y devolverá el modelo de fila para la tabla cuando se filtre.
- Para el filtrado del lado del servidor, esta función es innecesaria y puede ignorarse, ya que el servidor ya debería devolver el modelo de fila filtrado.
- Para el filtrado del lado del cliente, esta función es obligatoria. Se proporciona una implementación predeterminada a través de la exportación
{ getFilteredRowModel }de cualquier adaptador de tabla.
Ejemplo:
import { getFilteredRowModel } from '@tanstack/[adapter]-table'
getFilteredRowModel: getFilteredRowModel(),
})
API de Tabla
setColumnFilters
setColumnFilters: (updater: Updater<ColumnFiltersState>) => void
Establece o actualiza el estado state.columnFilters.
resetColumnFilters
resetColumnFilters: (defaultState?: boolean) => void
Restablece el estado de columnFilters a initialState.columnFilters, o se puede pasar true para forzar un restablecimiento a un estado en blanco predeterminado [].
getPreFilteredRowModel
getPreFilteredRowModel: () => RowModel<TData>;
Devuelve el modelo de fila para la tabla antes de que se haya aplicado cualquier filtrado de columna.
getFilteredRowModel
getFilteredRowModel: () => RowModel<TData>;
Devuelve el modelo de fila para la tabla después de que se haya aplicado el filtrado de columna.