必须在done回调中通过table.cache或res.data匹配行索引给tr添加deleted-row类,并用.deleted-row .layui-table-cell,.deleted-row .layui-table-cell *{text-decoration:line-through!important}覆盖layui内联样式。

直接加 CSS 类就行,但必须在 done 回调里操作 DOM,且要覆盖 Layui 的高优先级内联样式。
为什么不能用 tr:hover 或伪类动态控制删除线
Layui 单元格文字默认被包裹在 <div class="layui-table-cell"> 里,这个 div 有内联 <code>style="text-align: left;",还会被自动加上 layui-table-cell 等高权重 class。直接写 .deleted-row { text-decoration: line-through; } 会被覆盖。
必须用 !important 强制生效,且作用到单元格内部所有文本节点(包括图标、span 等嵌套内容):
.deleted-row .layui-table-cell,
.deleted-row .layui-table-cell * {
text-decoration: line-through !important;
}
别试图用 :after 伪元素模拟删除线——Layui 表格高度固定、cell 内部结构复杂,容易错位或被遮挡。
在 done 回调里给指定行加 class 的正确写法
假设后端返回的每条数据带 isDeleted: true 字段,你得在表格渲染完后遍历 tbody tr,按索引匹配 res.data[i],再加 class:
done: function(res, curr, count) {
const $box = this.elem.next('.layui-table-box');
$box.find('tbody tr').each(function(i, tr) {
const data = res.data[i];
if (data && data.isDeleted) {
$(tr).addClass('deleted-row');
}
});
}
- 必须用
this.elem.next('.layui-table-box')定位真实 tbody,因为 Layui 把渲染后的表格 DOM 放在了隔壁容器里 - 不能用
res.data.forEach然后查$('tr[data-index="x"]')——data-index是 Layui 自增的,不等于数组下标,尤其分页时会错乱 - 如果用了服务端分页(
url模式),res.data就是当前页数据,i和tr顺序严格对应,这是唯一可靠方式
纯 JS 写法(不依赖 jQuery)
如果你项目已移除 jQuery,可以用 querySelectorAll + dataset 配合 table.cache 获取数据:
done: function(res, curr, count) {
const cacheKey = this.config.id || 'table';
const cacheData = table.cache[cacheKey] || [];
const trs = this.elem.nextElementSibling
.querySelector('.layui-table-body tbody')
.querySelectorAll('tr');
<p>trs.forEach((tr, i) => {
const data = cacheData[i];
if (data && data.isDeleted) {
tr.classList.add('deleted-row');
}
});
}</p>
-
table.cache是 Layui 内部维护的当前表格全部缓存数据(含分页后所有页),但要注意:只有开启page: true且用url加载时,它才完整;若用data本地加载,它只存当前页 - 用
this.elem.nextElementSibling找 box 容器比 jQuery 的next()更轻量,也避免引入依赖 - 别用
tr.getAttribute('data-index')去查缓存——这个值在重载后可能重复或跳变,不可靠
真正容易被忽略的是:删除线不是交互状态,而是数据固有标记。一旦加了 deleted-row,就得确保后续 reload、排序、搜索都不会意外丢掉这个 class——所以所有操作都得基于数据源字段判断,而不是靠 DOM 上有没有 class 来决定是否显示删除线。











