layui table 的 page 事件监听分页参数更新后、数据请求前的时机,回调参数为 {curr, limit},用于拦截或修改请求;需在 render 的 done 回调中用 this 绑定,且仅对服务端分页生效。
layui table 的 page 事件到底监听什么
它监听的不是“点击下一页”这个动作,而是表格内部完成分页参数更新、重新加载数据前的那一刻。换句话说,page 事件触发时,curr(当前页码)和limit(每页条数)已经变了,但新数据还没拉下来——这是你干预请求参数或取消默认加载的最后机会。
常见错误是把它当成纯 UI 点击事件来用,比如想在点下一页时弹个提示,结果发现点了没反应,或者提示弹了两遍——因为表格默认会自动重载,你又手动调了table.reload(),造成重复请求。
- 只在初始化表格时通过
done回调里的res拿到当前页数据,别指望page事件里能直接拿到新数据 -
page事件的回调参数是{curr: 2, limit: 10},不是完整的obj实例,没法调obj.config.url - 如果你用了服务端分页,
page触发后表格会立刻按新curr/limit发请求;想拦截就得返回false,并自己调table.reload()
怎么正确绑定 page 事件(不是 jump)
很多人搜“layui 分页监听”,结果绑了 jump 事件,那是用于监听用户主动跳转到某页(比如输入页码回车),不是常规翻页。真要响应“上一页/下一页/首页/末页”点击,必须用 page。
实操上,不能在 table.render() 外部用 table.on('page(...)', ...) 去监听——那监听的是所有表格实例,且容易漏掉。正确姿势是在 render 的 done 回调里,用 this 拿到当前实例再绑定:
table.render({
elem: '#demo',
url: '/api/list',
page: true,
done: function(res, curr, count) {
// 此处 this 指向当前 table 实例
table.on('page(demo)', function(obj){
console.log('页码变了:', obj.curr, '条数:', obj.limit);
// 想加埋点、改请求头、或根据页码动态传参,就在这里做
});
}
});
- 事件名格式必须是
page(你的 table 的 id 或 lay-id),id 不对就完全不触发 - 如果渲染时没设
id,就用lay-id属性值;两者都没,page事件根本不会注册 - 别在
done外重复绑定,否则每次重载都新增一个监听器,导致回调执行多次
想改请求参数?别在 page 里直接改 config
有人试过在 page 回调里写 this.config.where = {...},发现没用——因为此时表格已经把旧参数缓存进请求队列了,改 config 不影响本次请求。
真正可控的方式只有两个:一是返回 false 阻止默认行为,再手动 reload 并传新参数;二是把动态参数写进 where 函数里,让它每次请求都实时计算:
table.render({
where: function(){
return {
token: localStorage.getItem('token'),
tab: $('#tab-filter').val(), // 每次请求都取最新值
timestamp: Date.now()
};
}
});
- 用函数形式的
where最省心,适合依赖外部表单、URL 参数或状态的场景 - 如果必须在
page里干预,记得return false;,然后调table.reload('demo', { where: { ... } }) - 别在
page里调table.reload()却不传where,那等于白拦——还是发原来的参数
兼容性注意:page 在 layui 2.8+ 才稳定
2.6.x 版本中,page 事件存在触发时机错乱问题:有时在数据返回后才触发,有时压根不触发。升级到 2.8.18 或更高版本才能确保它在请求发起前准时唤起。
如果你无法升级,替代方案是监听分页容器的点击事件,从 DOM 上读当前页码:
$(document).on('click', '.layui-laypage-next, .layui-laypage-prev', function(){
const curr = parseInt($('.layui-laypage-curr em').text()) || 1;
console.log('手动推算当前页:', curr);
});
- DOM 监听不可靠,比如用户点页码输入框回车,这种就捕获不到
- 2.8+ 的
page事件已修复与limit切换的联动问题,切换每页条数也会触发,且obj.limit是新值 - 别信网上那些“给
table.set()加钩子”的野路子,layui 源码里没暴露这个入口
最常被忽略的一点:page 事件只对开启了 page: true 的表格生效,静态数据(data: [...] )表格即使配置了分页条,也不会触发它——因为压根不发请求。


















