layui table 中 dataindex 不是原始数组下标,而是当前页序号,不可靠;应在 render 前为 data 每项添加 __index 字段,再通过 obj.data.__index 或 checkstatus.data.map(item => item.__index) 获取稳定原始索引。

layui table 获取选中行的 index 为什么不能直接用 dataIndex?
因为 layui 的 table.checkStatus() 返回的选中数据里,dataIndex 并不是你表格渲染时的原始数组下标(即 data 数组里的索引),而是当前页内的序号(从 0 开始),且在开启分页、搜索、排序后完全不可靠。真正稳定的“原始下标”得自己维护。
怎么在 render 前给每行打上真实 index?
最稳妥的方式是在传入 table.render() 的 data 数组里,提前把原始下标挂到每条数据对象上,比如加一个 __index 字段:
const myData = [
{ id: 1, name: '张三' },
{ id: 2, name: '李四' },
{ id: 3, name: '王五' }
];
// 注入原始下标
myData.forEach((item, i) => {
item.__index = i;
});
table.render({
elem: '#demo',
data: myData,
cols: [[
{ type: 'checkbox' },
{ field: 'name', title: '姓名' }
]]
});
- 这个
__index是你可控的、不随分页/筛选变化的唯一标识 - 不要用
id替代——如果后端 ID 不是连续整数或存在重复场景,就无法映射回原始数组位置 - 避免在
done回调里重新遍历data查找,性能差且易错
点击 checkbox 后如何拿到这一行的 __index?
监听 table.on('checkbox(...) 事件,从 obj.data 上直接读取你预设的字段:
table.on('checkbox(test)', function(obj){
console.log('原始下标:', obj.data.__index); // ✅ 就是你要的 index
console.log('是否选中:', obj.checked);
});
- 注意事件过滤器里的
test要和render时的id一致(即id: 'test') - 别误用
obj.tr去算tr.index()——DOM 顺序在分页/排序后已失效 - 如果用了服务端分页,
__index仅对当前页有效;如需全局唯一,应改用后端返回的主键 + 页码偏移计算
批量获取所有已选中行的原始 index 怎么做?
调用 table.checkStatus() 拿到选中数据数组,再 map 提取:
const checkStatus = table.checkStatus('test');
const selectedIndices = checkStatus.data.map(item => item.__index);
console.log('所有选中行原始下标:', selectedIndices); // [0, 2] 这类数字
- 返回的是数组,不是字符串,可直接用于
myData[index]取值 - 如果某行被删除或数据重载过,记得同步清理或重置
__index,否则会越界 - 千万别用
checkStatus.data.length当下标——那是数量,不是索引
dataIndex 和 DOM 位置就全不可信了。唯一靠谱的,是你自己在数据进表前亲手塞进去的那个 __index。











