table.getAllData() 仅在不分页时有效,分页状态下通常返回空数组;全量过滤需手动操作 table.cache 并重新渲染表格。
table.getAllData() 只在不分页时有效
它不是“搜索 api”,只是个数据快照读取器。如果你的表格启用了分页(page: true),table.getalldata() 大概率返回空数组 —— 因为 layui 默认只把当前页数据存进缓存,其他页的数据压根没加载到 js 内存里。
只有两种情况它能拿到全量数据:
① 初始化时传了本地全量 data: [...],且没开分页;
② 后端一次性返回全部数据(page: false),Layui 才会把整个数组塞进缓存并由 getAllData() 暴露出来。
常见误用:
• 用 url 加载 + page: true,还指望 getAllData() 返回几千条数据
• 调用 table.reloadData() 更新了数据,但 getAllData() 仍返回旧值(它不跟踪 reload 后的新 data)
前端过滤必须手动操作 table.cache
真正可控的全量过滤,得自己从 table.cache 拿原始数据、filter()、再用 table.render({ data: filtered }) 替换 —— 注意不是 reload(),否则会丢掉列配置、高度、工具栏等状态。
实操要点:
• 先确认表格 ID,比如 id: 'userTable',然后读 table.cache['userTable']
• 遍历时别直接用 tr DOM 或 td 文本,那些可能被 templet 改写过,要以 cache 中的对象为准
• 模糊匹配建议用 String.prototype.includes(),避免用户输 .、* 触发正则异常
• 空关键词必须显式处理:if (!keyword.trim()) return true,否则 filter 会过滤掉所有项
reload() 不适合做前端过滤,但可用来重置分页
有人想用 table.reload() 配合 where 实现前端过滤,这是错的:where 是给后端用的参数,Layui 不会在前端拿它去筛 table.cache。
如果你坚持用 reload(),唯一合理场景是:过滤完数据后,把结果重新传给表格,并强制回到第一页 —— 这时要:
• 显式传 data: filteredArray
• 必须带 page: { curr: 1 },否则用户还在第 5 页,看到的是空内容
• 补全所有初始化参数(cols、height、toolbar 等),不然渲染会出错或样式丢失
大数据量下容易卡顿,得加防抖和限定字段
哪怕只有 1000 条数据,每输一个字就遍历一遍 table.cache + filter(),输入框也会明显延迟。真实项目里必须加防抖(setTimeout 清除上次定时器),延迟 300ms 再执行。
另一个关键点:别对所有字段做 includes(),只搜用户明确想查的列。比如表头搜索框绑的是「用户名」,就只检查 item.username;如果同时有「邮箱」「城市」两个搜索框,就组合条件:item.username.includes(kw) || item.email.includes(kw),而不是扫整个对象。
最后提醒:Layui 2.8 的 table.getAllData() 和 table.cache 都不包含通过 table.reloadData({ where: {...} }) 动态追加的过滤条件 —— 它们只反映最原始的数据源。你要的“全数据过滤”,本质上是一次独立的前端计算,和 Layui 的分页、排序、服务端交互逻辑是平行关系,得自己兜底。


















