layui table 的 getData() 只返回原始数据而非当前页数据;本地分页可用 table.cache['id'] 获取当前页数据,服务端分页需在 done 回调中手动缓存 res.data。

layui table 的 getData() 方法只返回原始数据,不包含分页过滤
调用 table.getData('yourTableId') 拿到的是你传给 data 或通过 url 加载的**全部原始数据**,不是当前页渲染出来的那几行。很多人误以为它能返回当前页数据,结果在导出或批量操作时拿到全量数据,导致逻辑错乱。
- 如果你用的是本地数据(
data: [...]),getData()返回整个数组 - 如果你用的是服务端分页(
url+page: true),getData()仍返回空数组或初始 data,因为 layui 不会缓存服务端返回的每一页数据 - 当前页实际渲染的 DOM 行,layui 并未提供直接获取“当前页数据”的 API
用 table.cache 提取当前页数据(仅限本地分页)
当开启 page: true 且使用本地分页(即 data 是完整数组,layui 自动切片)时,layui 会在内部把当前页数据存进 table.cache['yourTableId']。这是最轻量、无需重请求的解法。
var cacheData = table.cache['test']; // 'test' 是你的 table 实例 lay-id // cacheData 就是当前页渲染的那几条数据(含被勾选/编辑等状态更新后的最新值)
- 必须确保配置了
id: 'test'(对应table.cache的 key) - 只在本地分页下有效;服务端分页时
table.cache通常为空或不准确 - 注意:如果用户手动修改过单元格(开启了
edit: 'text'),table.cache会自动同步变更,比 DOM 读取更可靠
服务端分页下,必须靠后端配合或手动记录页码参数
服务端分页时,layui 只知道“当前页码”和“每页条数”,并不保存数据副本。想拿到当前页数据,本质是要重发一次带 page=2&limit=10 的请求,或让后端支持按页码返回数据。
- 前端可读取
table.config['yourTableId'].page拿到当前页码和limit值 - 但无法绕过接口重新拉取——除非你在初始化时自己缓存过每页响应(比如用
localStorage或闭包变量存最近几次的 response) - 常见错误:试图用
$('tbody .layui-table-body tr')遍历 DOM 取文本,这拿不到 input/edit 中的最新值,也拿不到隐藏列或格式化后的字段
通用稳妥方案:改用 table.on('page', ...) + 主动缓存
不管本地还是服务端分页,最可控的方式是在每次翻页或重载后,把返回的数据存到一个变量里,并始终以它为当前页数据源。
var currentPageData = [];
table.render({
id: 'userTable',
url: '/api/user',
page: true,
done: function(res, curr, count){
currentPageData = res.data; // 显式缓存当前页数据
}
});
// 后续需要时直接用
console.log(currentPageData); // 就是当前页的 data 数组
- 这个
done回调在每次成功加载后触发,包括初始加载、翻页、重载(table.reload()) - 避免依赖 layui 内部机制,兼容性最好,逻辑最透明
- 注意:如果表格有行内编辑,需额外监听
edit事件同步更新currentPageData对应项
table.cache,服务端分页靠 done 缓存,别指望一个函数调用就解决所有场景。


















