layui table 的 page 默认从 1 开始,后端若要求 page=0 需通过 request 自定义参数名(如 offset)或在 request 函数中将 obj.page 减 1,并同步处理 reload 和 done 回调以确保页码一致。

layui table 的 page 配置默认从 1 开始,后端返回 page=0 会直接被忽略
layui table 内部对分页参数做了强校验:page 必须 ≥ 1,否则自动重置为 1。如果你的后端分页逻辑是「第 0 页 = 第 1 条到第 limit 条」,前端直接传 page: 0 不会生效,请求里依然发的是 page=1。
用 request 重写请求参数,把 page 映射为后端需要的偏移量
不要依赖 layui 默认的 page 字段,改用 request 自定义发送的参数名和值:
-
request是一个对象,必须包含pageName和limitName两个 key - 把
pageName设为后端实际识别的字段(比如"offset"),再在parseData里把page转成offset = (page - 1) * limit - 如果后端真要
offset=0表示第一页,就在request里手动算:当前页码减 1 后乘以每页条数
示例:
table.render({
elem: '#demo',
url: '/api/list',
request: {
pageName: 'offset', // 不传 page,改传 offset
limitName: 'limit'
},
parseData: function(res){
return {
"code": res.code,
"msg": res.msg,
"count": res.total,
"data": res.data
};
},
// 注意:这里 page 参数不再由 layui 自动拼,而是靠 request + parseData 协同控制
});然后在后端接收 offset,按 offset=0、offset=10 这样处理即可。
如果后端坚持用 page 且从 0 开始,只能在 request 中动态调整
有些后端接口文档写的是 page 从 0 起,但又不接受自定义字段名。这时不能改 pageName,得在请求发出前把 layui 的页码减 1:
- 监听
table.on('request', ...)或直接在request函数里拦截 - 用函数形式的
request,拿到原始obj后修改obj.page = obj.page - 1 - 注意:首次加载时
obj.page是 1,减 1 得 0;翻到第二页时是 2 → 变成 1,符合预期 - 但要同步处理
parseData:因为 layui 仍认为当前是第 1 页,count和data没问题,但页码显示会错位,需在done回调里手动重置table.cache或更新 toolbar 文字
简写方式:
request: function(obj){
obj.page = obj.page - 1; // 强制转为 0-based
return obj;
}容易漏掉的坑:reload 时没同步处理 page 偏移
调用 table.reload() 时,如果不显式传 page,它会沿用上一次的页码值(仍是 1-based),导致第二次请求又发了 page=1 而不是 page=0。
- 每次
reload都要带上page: curr - 1(curr是当前页码) - 或者统一用
where传参:where: {page: curr - 1},绕过内置 page 控制 - 更稳妥的是:所有分页操作都走
table.setCurrentPage(1)+reload,并在request函数里统一减 1
后端分页从 0 开始这事本身不难,难在 layui 把分页逻辑锁死了——你得在它组装请求的那一刻插手,晚一步就进不了后端。
















