最简单常用方式是在templet中直接使用d.lay_index,它表示当前页内从1开始的自然序号,不依赖dom、分页或排序,语义清晰且兼容性好。
templet 里直接用 d.lay_index 就行
这是最简单也最常用的方式:d.lay_index 是 layui 表格在渲染时自动注入每行数据的字段,表示「当前页内从 1 开始的自然序号」。它不依赖分页、排序或筛选,只要没手动关掉 page: false,这个值就是你看到的第几行(1 起始)。
注意它和 d.LAY_TABLE_INDEX 的区别:LAy_TABLE_INDEX 是全局唯一索引(从 0 开始),跨页累加;而 LAy_INDEX 是纯当前页序号,更符合“第 N 条”的直觉。
- 适用场景:仅需显示页内序号,比如“序号”列、操作列前缀编号
- 不需要额外计算、不依赖
done回调或缓存读取 - 如果表格开启了
page: false(不分页),LAy_INDEX和LAy_TABLE_INDEX + 1效果一致
为什么不能用 $(this).index() 或 DOM 查找
templet 函数执行时,DOM 还没生成,或者已生成但可能被重排(比如启用了排序、筛选、reload 后)。此时任何基于 $('tr') 或 $(this).closest('tr') 的查找都不可靠——你拿到的可能是上一页的 DOM、或是排序后错位的行。
更关键的是:templet 是纯函数式渲染,参数只有 d(当前行数据)和可选的 obj(Layui 2.6.0+ 支持),它根本不接触 DOM 元素,this 指向也不是预期的 tr。
- 常见错误:在 templet 里写
$(this).data('index')→ 报错或返回undefined - DOM 操作只适合在
rowDouble、tool等事件回调中使用,且必须配合obj.dataIndex验证逻辑位置
需要全局序号(含翻页)时怎么算
如果产品要求显示“全量第 X 条”,比如导出 Excel 时保持原始顺序编号,就不能只靠 d.LAY_INDEX。得结合分页参数手动算:
公式是:(curr - 1) * limit + d.LAY_INDEX,其中 curr 和 limit 来自 table.config['yourTableId'],但 templet 里拿不到 curr —— 必须提前存。
- 在
done回调里存:table.config['myTable'].__globalStart = (curr - 1) * config.limit + 1 - templet 中用:
var start = table.config['myTable'].__globalStart; return start + d.LAY_INDEX - 1; - 注意:这个方案依赖
done每次触发更新,如果用table.reload()但没传done,值就 stale 了
obj.index 是什么?能替代 d.LAY_INDEX 吗
Layui 2.6.0+ 在 templet 函数中支持第二个参数 obj,其中 obj.index 和 d.LAY_INDEX 值相同,都是当前页内 0 起始的序号(即 obj.index === d.LAY_INDEX - 1)。
所以它不是新能力,只是多一种写法。但要注意:obj 不稳定——低版本 Layui 不传,部分自定义列配置下也可能缺失;而 d.LAY_INDEX 从 1.x 就存在,兼容性更好。
- 推荐优先用
d.LAY_INDEX,语义清晰、版本无感 - 如果已在用
obj做其他事(比如动态取obj.field),顺手用obj.index也行,但别为了它强升 Layui 版本
真正容易被忽略的是:当表格启用了 autoSort: true 或通过 table.sort() 手动触发排序后,d.LAY_INDEX 仍按渲染顺序递增,但用户看到的“第一行”可能来自原始数据的中间某条——这时候序号本身已失去业务意义,是否还需显示,得看产品真实需求。











