table.checkStatus 只返回当前页选中数据是设计使然,因服务端分页时 DOM 重建导致跨页选中态无法自动维护;需用 window.selectedIds 等全局结构手动存取 ID,并在 checkbox 事件中增删,导出或提交时再按 ID 获取完整数据。
table.checkStatus 只返回当前页选中数据是设计使然
调用 table.checkstatus('mytable') 拿到的 data 数组永远只包含当前页已勾选的行,上一页、下一页的勾选状态不会出现在结果里。这不是 bug,layui 分页表格默认不跨页维护选中态 —— 因为服务端分页时每页 dom 是重建的,checkbox 节点被销毁,内部缓存也只保留当前页渲染数据。
必须自己维护全局选中 ID 列表
跨页记忆的核心是绕过 Layui 的 UI 层,直接操作业务标识(通常是 id 字段):
- 定义一个全局可访问的 Set 或数组,比如
window.selectedIds = new Set() - 在
table.on('checkbox(filter)', callback)里根据obj.checked和obj.data.id增删 ID - 注意:不要用
obj.data直接存对象,因为翻页后该引用可能失效;只存原始唯一键 - 如果表格没显式配置
id字段,得确保cols中有某个唯一字段(如user_code),并用它代替
导出或提交前,用 ID 列表捞完整数据
有了 selectedIds,后续动作才有依据:
- 前端已有全量数据(本地分页):遍历
table.cache['myTable'],用selectedIds.has(row.id)过滤出原始对象 - 服务端分页(更常见):把
[...selectedIds]拼成数组传给后端接口,由后端批量查详情,避免前端 N+1 请求 - 别漏掉空校验:
if (selectedIds.size === 0) { layer.msg('请至少选择一行'); return; } -
table.cache是内部结构,字段名可能含lay_table_index等渲染字段,别直接当业务数据用
“点击整行选中”和低版本兼容要注意
如果需求是点哪行就自动勾选对应 checkbox,得手动触发:
- Layui ≥ 2.8:在
table.on('row(filter)', ...)里调table.checkRow('myTable', obj.data) - Layui checkRow,只能监听
row事件后,用obj.data.id手动更新selectedIds,再调table.reload()强制重绘 checkbox 状态(性能差,慎用) - 别在
row回调里直接读 DOM 的checked属性 —— Layui 的 checkbox 是伪元素,真实 input 被隐藏,DOM 状态和内部缓存不同步
const selectedIds = new Set() 放在 table.on 外部但未挂载到全局或模块级变量,每次重新加载表格或切换路由就清空了。


















