templet函数中无法直接获取page参数,只能通过data.LAY_TABLE_INDEX(全局行索引)结合curr和limit手动计算当前页序号,推荐在parseData中预埋serialNo字段实现页内序号。
templet 函数里拿不到 page 参数?用 data 自带的 LAY_TABLE_INDEX
layui 表格的 templet 是个函数时,它只接收一个 data 参数,不传页码、不分页参数。很多人想靠 data.page 或 data.limit 算起始序号,结果是 undefined —— 因为这些字段根本不在单行数据对象里。
实际能用的只有 data.LAY_TABLE_INDEX,这是 layui 内部生成的**全局唯一行索引**(从 0 开始),但注意:它不是当前页的序号,而是整个表格渲染后的顺序(含隐藏页)。所以不能直接当“当前页第几条”用。
- 如果表格没开启分页(
page: false),LAY_TABLE_INDEX就是自然序号(+1 即可) - 如果开了分页,必须结合
layui.table.cache和当前页信息手动算 - 更稳的方式:在
done回调里把当前页起始值挂到table.config上,再在templet里读取
用 table.cache + 当前页码反推起始序号
layui 把每页数据存在 layui.table.cache['yourTableId'] 里,配合 table.config 能拿到 page、limit、curr。关键点在于:curr 是当前页码(从 1 开始),limit 是每页条数,所以当前页起始序号是 (curr - 1) * limit + 1。
但 templet 函数里拿不到 curr,得提前存好:
table.render({
id: 'myTable',
elem: '#myTable',
url: '/api/list',
page: true,
done: function(res, curr, count) {
// 把当前页起始序号存到 table.config 上,供 templet 读取
var config = table.config['myTable'];
config.__pageStartIndex = (curr - 1) * config.limit + 1;
}
});然后在 templet 里这样用:
templet: function(d) {
var config = table.config['myTable'];
var pageIndex = config.__pageStartIndex + d.LAY_TABLE_INDEX % config.limit;
return '<span>' + pageIndex + '</span>';
}-
d.LAY_TABLE_INDEX % config.limit是为了确保序号在当前页内归零重排(因为LAY_TABLE_INDEX是全局递增) - 这个写法依赖
config.limit不变;如果支持动态改每页数量,得在page事件里重新计算并更新__pageStartIndex - 注意
table.config是内部属性,不保证长期稳定,但目前(layui 2.8.x)可用
更干净的做法:用 lay-event + data-index 预埋序号
如果只是想显示序号,没必要在 templet 里硬算。可以在 cols 中加一列,用 templet 返回空,然后靠 CSS 或事件代理控制显示——但最省事的是:在 render 前把序号塞进原始数据。
比如后端返回数据时,就带上 serialNo 字段;或者前端在 parseData 里注入:
parseData: function(res) {
var curr = res.curr || 1;
var limit = res.limit || 10;
var start = (curr - 1) * limit;
res.data.forEach(function(item, i) {
item.serialNo = start + i + 1;
});
return {
code: res.code,
msg: res.msg,
count: res.count,
data: res.data
};
}然后列定义直接用:
{field: 'serialNo', title: '序号', width: 80}- 避免在
templet里做计算,性能更好,逻辑也更清晰 - 如果后端无法加字段,
parseData是唯一推荐的预处理位置 - 别在
done里改res.data,因为表格已经渲染完了,改了也不生效
为什么不用 data.LAY_TABLE_INDEX + 1 直接当页内序号?
因为 LAY_TABLE_INDEX 是整张表所有已渲染行的索引,不是当前页的。当你翻页时,layui 会销毁上一页 DOM 并渲染新页,但 LAY_TABLE_INDEX 仍按总顺序累加(比如第 2 页第 1 行可能是 LAY_TABLE_INDEX === 15)。所以直接 +1 得到的是全局序号,不是你想要的“当前页第 1 条”。
验证方法:打开浏览器控制台,打印任意一行 d,看 LAY_TABLE_INDEX 的值,再翻页对比——它不会重置为 0。
- 这个行为是 layui 渲染机制决定的,不是 bug
- 文档没明说,但源码里
LAY_TABLE_INDEX是基于table.index全局计数器生成的 - 所以任何想“页内重排”的需求,都必须自己算偏移量,绕不开
curr和limit
layui 表格序号这事,表面是取个数字,背后卡在渲染时机和数据作用域上。最容易被忽略的是:templet 函数的执行环境里,压根没有“当前页”这个上下文,所有依赖页码的计算,都得靠外部注入或提前预埋。


















