table.reload() 会触发 done 回调,但仅当显式传入 done 配置项且请求成功返回符合 layui 解析规则的有效数据时;否则跳过执行,进入 error 分支。

table.reload() 会触发 done 回调吗
会,但前提是 reload 时传入了 done 配置项,且请求成功返回有效数据。直接调用 table.reload('id')(无参数)不会触发 done,因为 layui 默认不继承原始 render 的回调配置。
常见错误是这样写:
table.reload('userTable');
——这只会刷新数据,done 完全不会执行。
正确做法是显式传入 done(以及必要时的 url、where 等):
table.reload('userTable', {
where: { status: 'active' },
done: function(res, curr, count) {
console.log('重载完成,当前页:', curr);
}
});
- 每次
reload都要重新传done,它不会自动复用初始化时的配置 - 如果表格用了
url+page: true,done在首次渲染和每次翻页/搜索后都会触发;但reload是独立事件,必须手动带过去 -
done只在请求成功且解析无误时执行;超时、404 或后端返回结构异常(如没包在data字段里)会导致它跳过,走error分支
为什么 table.reload() 后 DOM 操作失效,像没触发 done
不是没触发,而是你操作 DOM 的时机错了。layui 在 done 执行后还会做 scrollbar 补丁注入、固定列高度对齐等内部处理,此时直接改 tbody tr 的 innerHTML 很可能被覆盖。
典型现象:你在 done 里给某列加了个 badge,页面一闪就没了;或者翻页后 badge 消失。
解决办法是加 setTimeout 延后到微任务末尾:
done: function(res, curr, count) {
setTimeout(() => {
document.querySelectorAll('.layui-table-body tbody tr').forEach((tr, i) => {
const data = res.data[i];
if (data && data.status === 'error') {
tr.classList.add('error-row');
}
});
}, 0);
}
- 别用
$(tr).find()或jQuery链式操作去改内容,容易被 layui 内部重绘清掉 - 优先用
templet列配置做静态内容映射(比如状态码转文字),它会在每次重绘时自动执行,比done更稳 - 如果必须动态加载内容(如根据
d.id请求用户头像),done + setTimeout是目前最可靠时机
监听分页下拉框变化时如何手动触发 done 逻辑
layui 的分页器中“每页条数”下拉框(.layui-laypage-limits select)切换时,不会触发 page 事件,也不会自动调用 done。你得自己监听 change 并主动 reload。
关键点:这个 select 是动态生成的,且 reload 必须传 done 才能再次执行你的逻辑。
done: function(res, curr, count) {
// 确保 DOM 已挂载
setTimeout(() => {
$(document).on('change', '.layui-laypage-limits select', function() {
const newLimit = parseInt($(this).val());
table.reload('userTable', {
limit: newLimit,
done: function(res, curr, count) {
console.log('limit 改为', newLimit, ',done 再次执行');
}
});
});
}, 0);
}
- 用
$(document).on而非$('.layui-laypage-limits select').on,避免重复绑定 - 不要在 change 回调里直接调
table.render()—— 这会重建整个表格,丢失当前选中、排序等状态 - reload 时记得传当前页码
curr和limit,否则可能跳回第 1 页
done 不执行的三个高频原因
很多人以为 done 是“渲染完成”的通用钩子,其实它只响应一条路径:接口返回成功 + 数据结构可被正确解析。以下情况它根本不会运行:
- 后端返回的是纯数组(如
[{id:1}, {id:2}]),但没按 layui 默认格式包在data字段里 → 必须配parseData函数转换,否则res是空对象 - 接口响应头没设
Content-Type: application/json,或返回了 HTML 错误页(如 nginx 502)→ layui 解析失败,直接进error - 用了
data: []静态数据渲染 →done只触发一次;但若后续调table.reload({ data: [...] }),done不会再执行(因为没走 ajax)
真正容易被忽略的是:你写了 done,却没检查 res 结构是否符合预期。第一件事永远是 console.log(res),而不是直接取 res.data。


















