table.checkstatus() 是获取 layui 表格当前页选中行数据的唯一可靠方法,返回对象的 data 字段仅含 cols 中显式定义 field 的字段,跨页选中需自行用 set/map 维护 row.id 并结合 table.cache 恢复。

table.checkStatus() 是唯一可靠入口
别绕开 table.checkStatus() 去查 DOM 或遍历 input:checked —— layui 的选中状态完全由内部缓存管理,DOM 只是视图层。这个函数返回的对象里,data 字段就是当前页已勾选行的完整数据数组(注意:是“当前页”,不是全量)。
常见错误现象:table.checkStatus('myTable').data 返回空数组,大概率是因为:
- 表格初始化时没写
id: 'myTable',或调用时 ID 写错(比如大小写、短横线、多余空格) - 还没完成首次渲染就调用了,比如放在
table.render()后面但没等done回调 - 列配置里压根没加
{type: 'checkbox'},或者该列被fixed遮挡导致用户点不到 - 表格启用了
page: true且当前在第 2 页,但你之前在第 1 页勾选的行不会出现在这次结果里
data 里的字段为什么比原始数据少?
table.checkStatus().data 返回的每行对象,只包含你在 cols 中显式定义了 field 的字段。比如后端返回了 {id: 1, name: 'A', extra_info: 'xxx'},但 cols 只写了 {field: 'id'} 和 {field: 'name'},那 extra_info 就不会出现。
解决办法很直接:
- 如果只是想保留字段但不显示,加个
hide: true:{field: 'extra_info', hide: true} - 如果需要完整原始数据,用
row.id当 key 查table.cache['myTable'],例如:const full = table.cache['myTable'][row.id] - 别依赖
JSON.stringify(row)发请求——它可能漏掉你没配进cols的关键字段
单选模式下怎么拿数据?别混用事件
如果是 type: 'radio' 列,必须监听 table.on('radio(filter)', callback),而不是 checkbox 事件。回调参数 obj.data 就是当前被点中的那一行数据,不用再调 checkStatus()。
容易踩的坑:
- 写了两列
type: 'radio',或和checkbox混用 → 事件根本不会触发 - 监听了
checkbox却配了type: 'radio'→ 控制台安静如鸡,什么也不输出 - 以为
obj.checked会是false(取消选中),其实它永远是true;取消动作不发事件 - 想拿未在
cols中定义的字段?一样得靠table.cache+obj.value(即 id)去查
分页时“跨页选中”要自己兜底
layui 默认不保存跨页选中状态。checkStatus() 永远只返回当前页的数据,翻页后上一页的勾选就丢了。这不是 bug,是设计如此。
如果你真需要记住所有页的选中项:
- 在
onCheck和onCheckAll回调里,用Set或Map存row.id,别存整个row对象(内存和比较成本高) - 重载表格(
table.reload())前,把已存的id集合传进where或通过initSort+ 手动setRowChecked恢复 - 导出或删除时,别只用
checkStatus().data,要合并你维护的全局id集合,再从table.cache里捞数据
最常被忽略的一点:表格重载后,所有前端缓存的选中状态都会清空。不主动恢复,用户点过的勾就白点了。











