必须手动缓存并恢复选中状态:reload前用table.checkStatus()提取ID存变量,done回调中遍历table.cache匹配ID设item.checked=true,再调用table.checkStatus()重绘。
重载后保持选中状态:必须靠外部缓存 + done 回调恢复
layui 表格 reload 后所有选中状态都会丢失,table.cache 会被完全刷新,内部不保留历史勾选记录。想“自动恢复”,不能依赖 layui 自身机制,必须自己记、自己设。
reload 前要手动保存已选中行的唯一标识
别等 reload 完再找——那时 table.cache 已清空。必须在调用 table.reload() 前,从当前 table.checkStatus() 结果里提取关键字段(如 id 或业务主键),存到变量或闭包里:
-
table.checkStatus('yourTableId')返回对象含data数组,每项是当前页已勾选的原始数据 - 只存你后续能用来比对的字段,比如
userId、orderId,别存整行对象(可能含函数或循环引用) - 如果用了分页且需跨页恢复,得配合服务端返回的全量 ID 列表,或提前把“已全选”状态存在变量里
reload 的 done 回调里立即恢复勾选
reload 完成后,新数据已进 table.cache,但 DOM 还没同步勾选视觉。此时要遍历新缓存,匹配之前保存的 ID,打上 checked: true 标记,并强制刷新:
- 确保
done回调里先取table.cache['yourTableId'],再逐项比对 ID - 匹配成功后直接赋值
item.checked = true,不要用$.extend或深拷贝,会破坏引用 - 最后必须调用
table.checkStatus('yourTableId')(仅触发重绘,不传参)或table.render({ id: 'yourTableId' })重绘整表 - 注意:
table.checkAll()不适用——它只管当前页,且无法按 ID 精确恢复
radio 单选场景下更简单,但初始化逻辑必须一致
单选本质也是靠数据驱动,但不用操作 table.cache。只要 reload 后新数据里某行带 checked: true(或你自定义字段如 is_selected: true),并在列配置中用 templet 输出带 checked 属性的 <input type="radio">,就能自动渲染为选中态:
- 列配置示例:
{ type: 'radio', templet: function(d) { return '<input type="radio" name="selectRow" :>'; } } - reload 前同样要从
table.checkStatus()提取当前选中行的id,写入新请求的where参数或本地变量 - 服务端返回数据时,把匹配上的那行加上
is_selected: true字段即可
最易被忽略的是:reload 是异步操作,done 回调里的缓存操作必须紧贴执行,任何延迟(比如套个 setTimeout)都可能导致 table.cache 还未更新就去读,结果为空。另外,如果表格启用了 autoSort 或前端排序,恢复勾选前得确认排序是否已生效,否则索引错位会导致匹配失败。











