Layui table 不支持直接全文过滤,需手动实现:小数据量前端遍历 table.cache 过滤后 reload;大数据量须后端 LIKE 查询;reload 时需保留 page、height 等配置,并手动维护选中态、页码、滚动位置等状态。
table.filter 不能直接全文过滤,得靠 where + reload
layui 原生 table.filter 模块(如 tablefilter 插件)只支持列级下拉筛选,不提供“输入关键词、全字段模糊匹配”的能力。所谓“全文过滤”,本质是前端遍历所有字段做 includes() 判断,或后端按 keyword 全字段查——layui 自己不干这事,必须手动实现。
核心思路:监听搜索框输入 → 收集 keyword → 遍历 table.cache['id'] 过滤原始数据 → 调用 table.reload() 并传入 data 或更新 where。
- 如果数据量 ≤ 500 条,推荐前端过滤:取
table.cache['yourTableId'],用filter()遍历每项的每个字段(Object.values(item).some(v => String(v).includes(keyword))) - 如果数据量大,必须走服务端:把
keyword作为where参数传给接口,由后端执行 SQL 的LIKE '%xxx%' -
table.reload()必须显式传入id字段,否则无法定位缓存;若原渲染用了height、limit等配置,reload 时也得一并带上,否则样式/分页错乱
监听输入不能用 oninput 写在 templet 里
很多人在表头 templet 中直接写 <input oninput="doSearch()">,结果事件不触发——Layui 渲染时会剥离内联事件。正确方式是用事件代理:
layui.$(document).on('input', '.full-search-input', function() { const keyword = layui.$(this).val().trim(); if (!keyword) return; // 过滤逻辑走这里 });
- input 必须有唯一 class(如
.full-search-input),不能用 id,避免多表格冲突 - 别用原生
this.value,Layui 可能重绘 input,要用layui.$(this).val() - 加防抖(
setTimeout+clearTimeout),避免每敲一个字都 reload
reload 后 checkbox 状态丢失、分页重置怎么办
直接 table.reload({ data: filteredData }) 会导致已勾选行清空、当前页码跳回第 1 页、滚动位置归零。这不是 bug,是 reload 的默认行为。
- 要保留选中状态,必须自己维护
window.selectedIds = new Set(),并在done回调里遍历新数据,对 ID 存在的行手动加layui-form-checked类 - 要保持当前页码,reload 时传
page: { curr: table.config.page.curr }(需先保存原curr) - 更稳妥的做法是:不替换
data,而是清空where后让接口重新返回过滤结果,并在 done 中恢复选中态
空值、特殊字符、大小写这些细节容易崩
用户输空格、正则符号(.、*)、中文标点,或者大小写混输,都会让 includes() 失效或报错。
- 过滤前统一转字符串:
String(v || '').toLowerCase().includes(keyword.toLowerCase()) - 空 keyword 显式判断:
if (!keyword.trim()) return true,否则''会被当 false 导致无数据 - 字段值可能是
null、undefined、对象、数组,Object.values()会漏掉嵌套字段,简单场景建议白名单列出关键字段:['name', 'email', 'remark']
真正麻烦的不是写几行过滤逻辑,而是 reload 后如何让表格看起来“和之前一样”——选中态、页码、滚动条、排序图标、甚至编辑中的单元格,全得手动对齐。Layui 没有提供快照机制,这部分只能自己扛。


















