Skip to main content

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/accessorFn válido.
  • column.enableColumnFilter no está configurado como false
  • options.enableColumnFilters no está configurado como false
  • options.enableFilters no está configurado como false

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/===
  • weakEquals
    • 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 string que 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:

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.