Layui表格列级filter:true实现前端筛选,仅对本地data有效,需布尔值配置,不支持服务端筛选与多列联动,清空筛选需reload并重置where和页码。
直接在 cols 中加 filter: true
字段筛选不是靠工具栏按钮触发的,而是列级配置。只要在某列的配置对象里写上 filter: true,那一列表头右上角就会自动出现筛选图标(一个漏斗形状的 layui-icon-filter)。不需要额外引入插件,也不用监听 click 事件手动弹窗。
常见错误现象:加了 defaultToolbar: ['filter'] 却发现点不动任何列;或者写了 filter: 'true'(字符串)导致不生效——filter 必须是布尔值 true 或 false,不能是字符串或空值。
使用场景:适合枚举类字段,比如 status(待审核/已通过/已拒绝)、gender(男/女)、city(北京/上海/广州)等值域有限、重复率高的列。对 id、create_time 这类高离散字段开启 filter: true 意义不大,还会拖慢点击筛选弹窗的初始化速度(因为要遍历所有行提取去重后的显示文本)。
-
filter: true会基于当前列的templet渲染结果做去重,不是原始数据值 —— 比如后端返回1/2/3,但你用 templet 显示为启用/停用/锁定,筛选弹窗里出现的就是这三个中文词 - 不支持多列联动筛选(例如先筛“城市=北京”,再筛“部门=技术部”,后者只在前者结果中过滤)——Layui 原生不实现半选态和交叉过滤逻辑,点了第二列就清掉第一列的筛选
- 筛选弹窗里的选项默认全选,如果想默认只选某几项,得自己改源码或监听
table.on('filter(*)')后手动控制tr的显隐
服务端数据下,filter: true 不起作用?
它本来就不起作用。原生 filter: true 是纯前端行为,只对 data 属性传入的本地数据有效。一旦你用了 url 配置走 AJAX 加载,表格渲染时没有完整数据在内存里,filter: true 点击后弹出的筛选框会为空,或者只显示当前页的数据去重结果(极不可靠)。
正确做法是:关掉列级 filter: true,改用自定义搜索表单 + table.reload() 触发服务端筛选。
- 在表格上方放独立的
<input>、<select lay-search>、<input id="dateRange">等控件 - 绑定按钮 click 或 form submit 事件,收集非空条件到一个对象里,例如:
{ status: '1', city: '北京', start_time: '2026-01-01' } - 调用
table.reload('yourTableId', { where: params, page: { curr: 1 } }),其中page: { curr: 1 }必须显式带上,否则可能继续请求第 5 页而返回空数据 - 后端接口需按约定接收这些 key,并拼进 SQL 的
WHERE条件(注意空值过滤、SQL 注入防护)
如何清空已激活的字段筛选状态
Layui 没提供类似 table.clearFilter('id') 的 API。所谓“清空”,本质是让所有被隐藏的 <tr> 重新显示出来。最稳妥的方式是 reload 表格并重置 where:
table.reload('userTable', { where: {}, page: { curr: 1 } });
注意两点:一是 where: {} 而不是 where: null 或删掉该字段,否则旧条件仍会沿用;二是必须带 page: { curr: 1 },否则当前页码不变,reload 后可能还停留在最后一页。
如果你只是想临时“取消勾选”某个筛选项但保留其他列的筛选状态,做不到 —— Layui 的列筛选是互斥的,每次只允许一列处于激活筛选状态,点另一列就自动关闭前一个。
统计行(totalRow: true)在筛选后不更新?
这是最容易被忽略的坑。原生 totalRow 只在初始渲染或 reload 时计算一次,它统计的是整个数据源,不是当前筛选后可见的行。所以你用 filter: true 隐藏了 80% 的行,底部合计数还是全部数据的 sum。
解决办法只能手动干预:监听 table.on('filter(*)'),在回调里遍历当前所有未被 display: none 的 <tr data-index>,拿到对应原始数据(通过 table.cache['yourTableId']),再重新计算 sum/avg/count 并写回 .layui-table-total td 对应位置。
没有捷径。Layui 的统计行设计就是静态快照,不是响应式绑定。如果项目对实时统计要求高,建议放弃 totalRow: true,改用自定义 footer 区域 + 手动更新逻辑。


















