table.checkStatus() 拿不到跨页选中数据是因为它只返回当前页勾选项,不维护历史状态;必须用唯一id手动维护selectedIds数组,并在done回调中同步DOM和LAY_CHECKED状态。
table.checkStatus() 为什么拿不到跨页选中的数据
因为 table.checkstatus() 只返回当前页已勾选的 data 数组,它不维护、也不感知你之前在哪一页点过哪些行。layui 表格每次翻页都会重载 res.data,dom 完全重建,内部缓存只保留当前页状态。指望它“记住历史”会直接导致导出为空或批量操作漏数据。
必须用唯一字段(如 id)手动维护 selectedIds 数组
不能用 index、LAY_TABLE_INDEX 或临时生成的 key,翻页后这些值全部重排,映射必然错乱。后端返回的数据里必须有稳定唯一字段(比如 id),并在 table.render() 中通过 id: 'id' 显式声明(不是列定义里的 field)。
- 全局定义:
let selectedIds = []; - 监听
table.on('checkbox(test)', ...),根据obj.type区分单选/全选 - 勾选时:
if (obj.checked) { selectedIds.push(obj.data.id); } - 取消时:
selectedIds = selectedIds.filter(id => id !== obj.data.id); - 全选分支里只处理当前页数据(
obj.data.map(d => d.id)),别试图塞入全部 ID
done 回调里必须同步 LAY_CHECKED 和 DOM 状态
done 是唯一可靠的时机:DOM 已渲染完毕,setRowChecked 或手动操作才能生效。早于它(比如在 parseData 里)会失败;晚于它(比如 setTimeout)可能被后续渲染覆盖。
- 遍历
res.data,对每个row.id在selectedIds中存在的项,设row.LAY_CHECKED = 'true' - 同时执行:
$('input[type="checkbox"]').prop('checked', true)+.next().addClass('layui-form-checked') - 表头全选框也要手动同步:
$('.layui-table th[data-field="0"] input')的 checked 和 class - 别用
table.checkStatus('test').data当源数据去比对——它只含当前页已勾的,无法反推全局
table.reload() 时勾选状态丢失的根源和修复
很多人以为 table.reload() 调用就能刷新,结果 checkbox 全清空。根本原因是:reload 不继承初始配置,漏传 url、where、page 中任意一项,表格就可能跳回第 1 页、发空请求,甚至渲染失败——而勾选状态只绑定在当前页 DOM 和内部缓存上,重绘即丢。
- 必须显式传全:
table.reload('test', { url: '/api/list', where: { token: localStorage.getItem('token') }, page: { curr: tableIns.config.page.curr } }) -
where里涉及动态值(如 token、搜索条件)必须每次重新读取,不能写死 - 跨页勾选依赖
selectedIds持久化,reload 后仍需在done里走一遍还原逻辑











