Layui 2.8+ 中 table.reloadData 默认重置页码为 1,必须显式传入 page: { curr: n }(n 为数字)才能保持当前页;推荐用 reloadWithPage 封装安全调用。
table.reloadData 默认会跳回第一页
这是 layui 2.8+ 的明确行为,不是 bug。只要调用 table.reloaddata(),哪怕只传 { data: [...] },内部也会把 page.curr 重置为 1。因为该方法设计初衷是「轻量刷新数据」,不接管分页状态维护——它压根不管你在哪一页,只管把新数据塞进去、重绘当前页 dom。
必须显式传入 page: { curr: n }
关键点在于:Layui 不自动继承页码,你得主动告诉它“我要留在第 n 页”。这个 page 是透传参数,不是可选的装饰项,而是决定是否跳页的核心开关。
-
curr必须是数字,不能是字符串(比如"2"会导致静默失败) - 必须传完整对象
{ curr: n },只传curr: n或page: n都无效 - 推荐从
table.config['yourTableId']?.page?.curr取值,而不是靠$(".layui-laypage-curr").text()这类 DOM 查询——后者在异步渲染未完成时可能为空或错位 - 如果表格尚未初始化(
table.config['id']为undefined),直接取会报错,建议加空值判断
封装一个 reloadWithPage 避免重复出错
每次手写 table.config[...].page.curr 容易漏掉可选链、拼错 ID、或忘了兜底,默认值写成 1 而非 || 1 就可能崩。一个简版 helper 足够覆盖多数场景:
function reloadWithPage(id, opts = {}) {
const config = table.config[id];
if (!config) return;
const curr = config.page?.curr || 1;
table.reloadData(id, { page: { curr }, ...opts });
}
调用时就干净多了:reloadWithPage('userTable', { data: newData })。注意:不要在 opts 里再嵌套一层 page,否则会覆盖掉你刚算出来的 { curr }。
别为了省事换成 table.reload()
有人试过用 table.reload() 替代,觉得“反正它能记住页码”,但这是拿稳定性换便利:
-
table.reload()会重新绑定所有事件,导致点击行重复弹窗、工具栏按钮触发多次 - 若列定义是动态生成的(比如根据后端字段配置),
reload()可能丢掉已渲染的自定义列 - 如果用了
done回调且依赖闭包变量(如搜索关键词),reload()后这些变量可能已失效 - 它还会强制重请求后端,而
reloadData()可以只换前端数据,适合 mock 或局部更新场景
真正容易被忽略的是:页码不是表格的“固有属性”,而是每次刷新时你和 Layui 之间的一次显式约定。没说清楚,它就按默认来。











