用 table.cache['yourTableId'] 最稳,因 getData 只返回当前页过滤后的可见行数据,而 cache 存的是分页逻辑切分的完整原始数据块,且需在 done 回调后读取。
layui table 获取当前页数据用 getData 还是 cache?
直接说结论:用 table.cache['yourtableid'] 最稳,table.getdata('yourtableid') 只返回“当前页过滤后”的数据(比如带搜索、筛选时),容易漏掉没显示但实际在当前页缓存里的行。
原因在于 getData 是对渲染后 DOM 的“可见行”做提取,而 cache 是表格实例初始化时按分页逻辑切分好的原始数据块——它才是你点击“第2页”后真正加载进来的那 10 条(或你设的 limit 条)完整数据。
-
table.cache是对象,key 是你在table.render()里传的id或elem的唯一标识 - 确保你在
render时写了id: 'userTable',否则table.cache['userTable']会是undefined - 如果用了服务端分页(
page: true且url配了接口),cache里只存当前页响应回来的数据,不是全量
为什么 table.getData() 有时返回空数组?
常见于两种情况:表格刚渲染完还没触发首次分页请求;或者你调用时机太早,在 done 回调外就取数据。
Layui 表格是异步加载的,render() 执行完不代表数据已写入 cache 或 DOM。必须等 done 回调触发后才能安全读取。
- 错误写法:
table.render({ id: 'list', ... }); console.log(table.getData('list'));→ 极大概率输出[] - 正确位置:把取数据逻辑放进
done: function(res, curr, count) { ... }里 - 如果你需要在外部按钮点击时获取当前页数据,确保表格已完成首次加载(可加
if (!table.cache['list']) return守卫)
如何拿到带 checkbox 选中状态的当前页数据?
table.cache 不包含勾选状态,它只存原始字段。要合并选中信息,得手动比对 table.checkStatus('yourTableId') 返回的 data 数组。
这个 API 返回的是“所有被勾选的行数据”,但它不区分页码——只要勾选了,哪怕在第5页,也会出现在结果里。所以你要自己过滤出“当前页”的选中项:
const cache = table.cache['userTable'] || [];
const checked = table.checkStatus('userTable').data;
const currentPageChecked = checked.filter(item => cache.some(c => c.id === item.id));
注意这里用 id 匹配,前提是你的数据里有唯一标识字段(如 id),且没被 cols 配置里隐藏掉——隐藏了字段,cache 里依然有,但 checkStatus().data 里可能没有该字段,匹配会失败。
导出当前页数据时容易忽略的兼容点
很多人用 table.exportFile() 导出,但默认行为是导出“全部数据”(需服务端配合),不是当前页。想导出当前页,必须手动拼 CSV 或调用 exportFile 的第三个参数传自定义数据。
- 别依赖
exportFile('userTable')默认行为,它不会自动限制为当前页 - 稳妥做法:
layui.table.exportFile('userTable', table.cache['userTable'], 'csv'); - 如果用了自定义表头(
cols里改了field或加了templet),导出内容仍以cache原始字段为准,和页面显示可能不一致 - 移动端或低版本 IE 下,
exportFile可能静默失败,建议加try/catch并 fallback 到复制文本
最麻烦的其实是字段映射——页面上显示 “启用”,数据里存的是 status: 1,cache 里还是 1,导出时就得自己 map 一遍再传给 exportFile。

















