layui表格搜索后自定义空状态图片消失,因table.reload()会重建dom导致旧节点被销毁;需在done回调中用settimeout延迟获取并重写.layui-table-empty内容,且每次都要清空内联样式。

搜索结果为空时,Layui 表格默认的「暂无数据」提示不会自动响应搜索动作——你得手动干预 DOM,否则空状态会残留或消失,图片根本出不来。
为什么搜索后自定义图片不见了
table.reload() 或触发搜索时,Layui 会清空并重绘整个 .layui-table-body,包括你之前用 done 注入的 .layui-table-empty 内容。这不是 bug,是渲染机制决定的:每次重载都新建 DOM,旧节点被销毁。
- 只在初始化
table.render()的done里插图,搜索后必然丢失 - 没监听搜索事件(如
toolbar中的按钮、where变更),就无法触发重置逻辑 - 直接改
text.none没用——它只接受纯文本,<img>会被转义成字符串显示
必须监听 search 事件并重写 empty 区域
搜索动作本质是 table.reload(),所以要在 reload 前/后补上空状态处理。推荐在 done 回调里统一处理,但需确保它对「所有加载时机」生效(首次加载、分页、搜索、重载)。
- 判断依据始终用
count === 0(服务端分页)或res.data && res.data.length === 0(前端分页) - 每次进入
done都查document.querySelector('.layui-table-empty'),不要缓存节点引用 - 务必加
setTimeout(() => { ... }, 0),否则 DOM 可能还没生成,查不到.layui-table-empty - 拿到元素后第一件事是清内联样式:
emptyEl.style.cssText = '',否则padding: 40px 0会撑乱你的图片布局
完整可复用的 done 写法(含搜索兼容)
done: function(res, curr, count) {
if (count === 0) {
setTimeout(() => {
const emptyEl = document.querySelector('.layui-table-empty');
if (emptyEl) {
emptyEl.style.cssText = '';
emptyEl.innerHTML = `
<div style="text-align:center;padding:30px 0;">
@@##@@
<p style="margin-top:12px;color:#999;font-size:14px;">没有匹配的数据</p>
</div>
`;
}
}, 0);
}
}
注意:/imgs/search-empty.png 要替换成你自己的路径;如果表格有固定列(height 设置),.layui-table-empty 可能出现在多个位置(如 .layui-table-fixed-l .layui-table-empty),但通常主容器已覆盖,无需额外处理——除非你发现图片错位到左侧空白区。
最常被忽略的细节
很多人以为只要写了 done 就一劳永逸,其实关键在「时机」和「作用域」:搜索后表格 DOM 是全新生成的,你不能依赖初始化时的变量或闭包;.layui-table-empty 是 Layui 动态插入的,类名不能写错(不是 .layui-none);还有人把图片宽高写死成 80px,结果在高清屏上模糊——建议用 max-width: 100% + height: auto 保比例。











