筛选插件
VTable 提供了功能强大的筛选插件,支持按值筛选和按条件筛选两种模式,帮助用户快速过滤和查找表格数据。
功能特性
- 按值筛选:从列的所有唯一值中选择要显示的数据
- 按条件筛选:使用操作符设置筛选条件(等于、大于、包含等)
- 多种操作符:支持文本、数值、布尔值等不同类型的筛选操作
- 列级别控制:可以为特定列启用或禁用筛选功能
- 状态持久化:支持筛选状态的保存和恢复
- 智能图标:自动显示筛选状态图标
筛选插件配置选项
FilterPlugin 筛选插件可以配置以下参数:
export interface FilterOptions { /** 筛选器 ID,用于唯一标识筛选器 */ id?: string; /** 筛选器图标 */ filterIcon?: VTable.TYPES.ColumnIconOption; /** 筛选器激活图标 */ filteringIcon?: VTable.TYPES.ColumnIconOption; /** 筛选功能启用钩子函数,返回指定列是否启用筛选功能 */ enableFilter?: (field: number | string, column: VTable.TYPES.ColumnDefine) => boolean; /** 默认是否启用筛选(当 enableFilter 未定义时使用) */ defaultEnabled?: boolean; /** 筛选模式:按值筛选、按条件筛选 */ filterModes?: FilterMode[]; /** * 筛选器样式 * 如果样式配置更新, 需在更新图表之前额外调用 `filterPlugin.updateStyles` * */ styles?: FilterStyles; /** 自定义筛选分类 */ conditionCategories?: FilterOperatorCategoryOption[]; /** 自定义筛选选项展示格式 */ checkboxItemFormat?: (rawValue: any, formatValue: any) => any; /** 多个筛选器之间是否联动 * @default true */ syncFilterItemsState?: boolean; /** 筛选记录结束回调 */ onFilterRecordsEnd?: (records: any[]) => void; }
配置参数说明
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | string | filter-${Date.now()} | 插件实例唯一标识符 |
filterIcon | ColumnIconOption | 默认筛选图标 | 未激活状态的筛选图标 |
filteringIcon | ColumnIconOption | 默认激活图标 | 激活状态的筛选图标 |
enableFilter | function | - | 自定义列筛选启用逻辑 |
defaultEnabled | boolean | true | 默认是否启用筛选 |
filterModes | FilterMode[] | ['byValue', 'byCondition'] | 支持的筛选模式 |
styles | FilterStyles | - | 自定义筛选器样式 |
conditionCategories | FilterOperatorCategoryOption[] | - | 自定义筛选分类 |
checkboxItemFormat | (rawValue: any, formatValue: any) => any | - | 自定义筛选选项展示格式 |
syncFilterItemsState | boolean | true | 多个筛选器之间是否联动 |
onFilterRecordsEnd | (records: any[]) => void | - | 筛选记录结束回调 |
筛选操作符
插件支持以下筛选操作符:
通用操作符
equals- 等于notEquals- 不等于
数值操作符
greaterThan- 大于lessThan- 小于greaterThanOrEqual- 大于等于lessThanOrEqual- 小于等于between- 介于notBetween- 不介于
文本操作符
contains- 包含notContains- 不包含startsWith- 开始于notStartsWith- 不开始于endsWith- 结束于notEndsWith- 不结束于
布尔操作符
isChecked- 已选中isUnchecked- 未选中
使用示例
基本使用
import * as VTable from '@visactor/vtable'; import { FilterPlugin } from '@visactor/vtable-plugins'; // 创建筛选插件 const filterPlugin = new FilterPlugin({}); // 创建表格配置 const option = { records: data, columns: [ { field: 'name', title: '姓名', width: 120 }, { field: 'age', title: '年龄', width: 100 }, { field: 'department', title: '部门', width: 150 }, { field: 'salary', title: '薪资', width: 120 } ], plugins: [filterPlugin] }; // 创建表格实例 const tableInstance = new VTable.ListTable(document.getElementById('container'), option);
高级配置
// 自定义筛选启用逻辑 const filterPlugin = new FilterPlugin({ // 自定义哪些列启用筛选 enableFilter: (field, column) => { // ID 列不启用筛选 return field !== 'id' && column.title; }, // 只启用按值筛选 filterModes: ['byValue'], // 自定义图标 filterIcon: { name: 'custom-filter', type: 'svg', width: 16, height: 16, svg: '<svg>...</svg>' } });
列级别筛选控制
const columns = [ { field: 'name', title: '姓名', width: 120 }, // 默认启用筛选 { field: 'age', title: '年龄', width: 100, filter: false }, // 禁用筛选 { field: 'department', title: '部门', width: 150 } // 默认启用筛选 ];
状态持久化
// 获取当前筛选状态 const filterState = filterPlugin.getFilterState(); // 保存到本地存储 localStorage.setItem('tableFilterState', JSON.stringify(filterState)); // 从本地存储恢复 const savedState = JSON.parse(localStorage.getItem('tableFilterState')); if (savedState) { filterPlugin.setFilterState(savedState); }
完整示例
大屏业务场景案例
使用说明
- 点击筛选图标:点击列标题右侧的筛选图标打开筛选面板
- 按值筛选:在筛选面板中选择要显示的值
- 按条件筛选:选择操作符并输入筛选条件
- 应用筛选:点击"确认"按钮应用筛选条件
- 清除筛选:点击"清除筛选"链接移除当前列的筛选
注意事项
- 筛选插件目前仅支持
ListTable,不支持PivotTable - 使用列级别筛选控制时,需要在列定义中添加
filter属性 syncFilterItemsState默认为true, 此时筛选状态会在表格配置更新时自动同步- 建议为大数据量表格启用筛选功能以提升用户体验
- 如果样式配置更新, 需在更新图表之前额外调用
filterPlugin.updateStyles