不能靠 table.checkStatus() 的 data 字段获取原始对象,应通过 table.cache'id' 反查原始数据,因 checkStatus 返回的是带内部字段的渲染态数据,而 table.cache 保留初始化时的完整原始字段。
layui table 复选框全选后怎么拿到当前页的原始数据
直接说结论:不能靠 table.checkstatus() 的 data 字段直接拿“原始对象”,它返回的是带 checkbox 状态的渲染后行数据,字段名、结构可能被 layui 内部改写(比如加了 laytablecheckbox 这种私有字段),且不包含你初始化时传入的完整原始字段。
为什么 table.checkStatus('id') 返回的数据不是你要的原始对象
因为 layui 表格在渲染时会对原始数据做浅拷贝并注入控制字段(如 LAY_TABLE_INDEX、layTableCheckbox),checkStatus 返回的是这一层“视图态”数据,不是你调用 table.render() 时传入的 data 或从接口返回的原始数组项。
- 原始对象里有
userId、nickName,但checkStatus().data里可能只有id、username(如果列字段映射过) - 如果你用了
parseData或response自定义解析,原始结构更难对齐 - 分页模式下,
checkStatus只返回当前页已渲染的行,这点是对的;但字段失真问题依然存在
正确做法:用 table.cache + 当前页索引反查原始数据
layui 内部把每页原始数据缓存在 table.cache['id'] 里(key 是你 render 时传的 id),它保留了最开始传入或接口返回的完整对象。只要你知道当前页码和每页条数,就能定位到对应原始数据范围。
实操步骤:
- 确保初始化表格时设置了唯一
id,比如id: 'userTable' - 用
table.checkStatus('userTable')拿到当前页所有被勾选的行的LAY_TABLE_INDEX(这是 layui 渲染序号,从 0 开始) - 查
table.cache['userTable'],它是一个一维数组,按当前页顺序排列,索引和LAY_TABLE_INDEX对应 - 遍历勾选项,用
LAY_TABLE_INDEX当作下标去table.cache里取原始对象
示例代码片段:
const checkStatus = table.checkStatus('userTable');
const cacheData = table.cache['userTable'] || [];
const selectedRaw = checkStatus.data.map(item => {
return cacheData[item.LAY_TABLE_INDEX];
});
容易漏掉的坑:翻页后 table.cache 不自动刷新?
会刷新——但只在你用 table.reload() 或触发分页切换(如点击页码)后更新。如果你手动修改了 table.cache,或者在 reload 前就调用了 checkStatus,可能拿到旧缓存。
- 不要在
done回调外提前读table.cache,它可能还没写入 - 如果用了异步加载(
url+ 分页),table.cache只存当前页,不是全部数据 - 注意:如果表格启用了
autoSort: true且用户点过表头排序,table.cache仍是原始顺序,但渲染顺序已变,此时LAY_TABLE_INDEX和缓存索引仍一致(layui 内部做了映射),所以这个方案依然可靠
最稳的方式,是在监听到 checkbox 变化(on('checkbox)或点击全选之后,立刻用上面方法取,别跨事件周期缓存结果。

















