Layui的table.checkStatus()只返回已勾选行数据,未选中行需手动计算:用table.cache['id']全量数据减去checkStatus().data已选项,依赖唯一字段(如id)比对,且必须在done回调后执行。
table.checkStatus() 拿不到未选中行,这是设计使然
layui 的 table.checkstatus() 只返回已勾选的行数据,它压根不提供「未选中」的接口。所谓“一键获取未选中行”,本质是「用当前页全量数据减去已选中数据」——必须自己算,没有魔法方法。
正确姿势:用 table.cache + table.checkStatus().data 做差集
前提是表格已渲染完成(即在 done 回调里或之后执行),且你用了 id: 'yourTableId' 初始化:
-
table.cache['yourTableId']是当前页完整原始数据数组(服务端分页下就是接口返回的那一页) -
table.checkStatus('yourTableId').data是当前页所有已勾选行的数据数组 - 两者都含原始字段,可直接用唯一键(如
id)比对
示例代码(一行核心逻辑):
const cache = table.cache['userTable'] || [];
const checked = table.checkStatus('userTable').data;
const unchecked = cache.filter(row => !checked.some(ck => ck.id === row.id));
容易踩的坑:字段缺失、ID 不一致、时机不对
常见错误现象:unchecked 为空、长度不对、部分行消失:
- 检查数据里是否真有
id字段 —— 如果后端返回的是user_id或pk,就得改成ck.user_id === row.user_id -
table.checkStatus()在表格刚 render 完就调,会返回空数组 → 必须等done回调触发后再执行 - 如果列配置
cols里漏写了id字段(哪怕设hide: true),checkStatus().data中可能不带id→ 导致比对失败 - 用户点了「全选」但没翻页,
cache仍是当前页数据,没问题;但若你用了前端分页(page: false),cache就是全部数据,此时「当前页未选中」的语义就变了
替代方案:DOM 遍历只适用于简单场景
如果不想依赖缓存,又确定所有行都已渲染(比如没开分页、或已手动翻过所有页),可用 DOM 反查:
const tableId = 'userTable';
const cache = table.cache[tableId] || [];
const $rows = $(`table[lay-id="${tableId}"] tbody tr[data-index]`);
const uncheckedData = $rows
.filter(':not(.layui-table-clicked, .layui-table-hover)')
.map((i, tr) => {
const index = $(tr).data('index');
return cache[index];
})
.get();
但注意:.layui-table-clicked 是行点击高亮类,不是选中状态;真正勾选的行 DOM 上只有 layui-form-checked 类,且 checkbox 是伪元素,不能靠 :checked 判断 —— 所以 DOM 方案不可靠,仅作临时兜底。


















