可在done回调中通过url设为函数并用performance.now()手动埋点获取接口耗时,绑定到表格实例而非全局变量,并在rendered事件或setTimeout后安全注入分页栏,避免DOM错位与并发冲突。
layui table 的 done 回调里拿不到接口耗时?
因为 done 只传 res 和 curr、count,不带时间信息。layui 默认不记录请求耗时,得自己埋点——不是改源码,也不是等官方支持,而是用原生 xmlhttprequest 或 fetch 封装一层再喂给 table.render()。
怎么在 url 配置为字符串时手动注入耗时?
不行。只要写成 url: '/api/list',Layui 就走内部 $.ajax,你插不进钩子。必须切换成 url 为函数的形式,自己控制请求发起和响应处理:
-
url设为函数,返回一个 Promise(或直接 resolve 数据) - 在函数内用
performance.now()记开始/结束时间 - 把耗时算出来,存到全局变量或闭包里,供
done读取 - 注意:Layui 2.8+ 支持 Promise,旧版需用
layui.jquery的$.ajax+done手动 resolve
table.render({
elem: '#demo',
url: function (obj) {
const start = performance.now();
return $.ajax({
url: '/api/list',
data: { page: obj.page, limit: obj.limit },
dataType: 'json'
}).then(res => {
const cost = Math.round(performance.now() - start);
window.lastApiCost = cost; // 简单挂 window,也可用闭包
return res;
});
},
done: function (res, curr, count) {
// 更新分页栏右侧文字
const $info = $('.layui-table-page .layui-laypage-curr + .layui-laypage-skip');
if ($info.length) {
$info.before(`<span style="margin-right:10px;color:#999;">耗时:<code>${window.lastApiCost}</code>ms</span>`);
}
}
});分页栏 DOM 不稳定,插入耗时文字容易错位?
Layui 分页结构会随版本微调,硬查 .layui-laypage-curr + .layui-laypage-skip 容易失效。更稳的做法是:在 done 里用 setTimeout 延迟一小会,等 Layui 渲染完再操作;或者监听 table.on('rendered')(Layui 2.8+):
- 不要依赖固定兄弟节点关系,优先找带明确文本的容器,比如含
共字的.layui-laypage-count - 插入位置选在
.layui-laypage内部末尾,比塞在中间更鲁棒 - 如果表格启用了
loading: true,记得在耗时文字上加font-size: 12px避免撑高分页栏
多表格共存时,怎么避免耗时显示错乱?
用 window.lastApiCost 这种全局变量,在并发请求或快速翻页时会覆盖。正确做法是把耗时绑定到当前表格实例上:
- 渲染前用
table.on('init', 'test', function (othis, filter) {...})记录实例 ID - 在
url函数里把耗时存在othis.config.id对应的 Map 里 -
done中通过this.elem.attr('lay-id')取出对应耗时,避免交叉干扰 - 别忘了清旧数据——比如在
request开始前删掉上一次的记录
真正麻烦的不是加那几行代码,而是 Layui 分页 DOM 没暴露标准 slot 或 hook,所有定制都得靠 DOM 注入 + 时间差博弈。稍微换套 UI 框架,这活儿就变成配个 layout 属性的事了。


















