最稳妥方案是用 table.on('row(id)') 监听并加 class 高亮,配合 done 回调恢复状态;row-style 仅设默认样式,不可用于点击响应;CSS 必须写 .layui-table tbody tr.active td {background-color: #f0f8ff !important;}。
用 table.on('row(id)') 监听点击并改 background-color
直接监听 table.on('row(id)') 是最稳妥的入口,它在行渲染完成、事件绑定就绪后才触发,比手动给 tbody tr 绑 click 更可靠。回调里的 obj.tr 就是当前行 dom,可直接操作样式。
但注意:仅靠 $(obj.tr).css('background-color', '#00BBFF') 不够 —— layui 重绘(如分页、搜索、reload)会清空内联样式,且多行可能同时高亮。必须配套清理逻辑:
- 先用
$('div[lay-id="id"] .layui-table-body tr').css('background-color', '')清掉旧高亮(lay-id是表格容器的属性,不是 render 的id) - 再给
obj.tr加样式,或加 class(推荐) - 若需跨页保持选中,别依赖
data-index(仅当前页序号),改用数据本身的唯一字段(如obj.data.id)存状态
row-style 回调里不能动态返回点击色
row-style 是渲染时一次性计算的函数,参数只有 row 和 index,拿不到点击状态。把它和点击事件混用,极易样式打架:比如你点完某行,row-style 下次重绘又把背景色覆盖回去。
常见错误写法:rowStyle: function(row, index) { return activeIndex === index ? { 'background-color': '#f0f8ff' } : {}; } —— 这看着像响应式,实则失效。因为 activeIndex 变了,row-style 不会自动重执行;而 reload 后 row-style 才跑,此时 activeIndex 若没同步,就白写了。
真正该做的:只用 row-style 设默认态(比如偶数行浅灰),点击高亮交给事件 + class 管理。
加 class 比内联 style 更稳,但 CSS 必须带 !important
layui 表格的单元格背景由多层样式叠加控制,尤其启用了 skin: 'line' 或 'nob' 时,td 默认透明,直接改 tr 背景色会被盖住。所以定义 class 时,得锁死 td:
.layui-table tbody tr.active td {
background-color: #f0f8ff !important;
}
别漏掉 !important,也别只写 tr.active —— 那只影响 tr 自身,不穿透到 td 内容区。另外,移动端要补 cursor: pointer,否则用户看不出可点。
表格重载后高亮丢失,必须在 done 回调里恢复
table.reload() 会重建整个 tbody,所有 class 和内联样式全丢。很多人忘了这步,导致“点完刷新,高亮没了”。
正确做法是把当前激活索引存在外部变量里,比如 let activeRowId = null,点击时赋值为 obj.data.id;然后在 reload 的 done 回调里主动恢复:
table.reload('test', {
done: function() {
if (activeRowId !== null) {
const $target = $(`tr[data-data-id="${activeRowId}"]`);
$target.addClass('active');
}
}
});
前提是你的数据里有 id 字段,且渲染时通过 row-style 或 templet 把它塞进 tr 的自定义属性里,例如:tr.setAttribute('data-data-id', row.id)。否则光靠 data-index,跨页就找不到人。
row-style 当响应式工具用——它真不是。











