必须手动控制 toolbar 按钮 loading 状态,通过插入/移除 dom 元素、添加/删除 class 控制禁用与提示,配合 before/done 回调及 finally 清理,避免状态丢失或残留。
不能直接给 toolbar 按钮加 loading,必须手动控制 dom + 状态拦截,否则点击后无反馈、重复提交、样式错乱全都会发生。
toolbar 按钮本身不支持 loading 属性
Layui 的 toolbar 是全局模板,渲染时不绑定单行数据,也没有内置 loading 开关。你写 loading="true" 或在按钮上加 disabled 后再 JS 控制,表格重载、分页、筛选后状态就丢失——因为 layui 不维护这些 DOM 的生命周期。
- 所有对 toolbar 按钮的 loading 控制,都得靠你自己插入/移除 loading 元素 + 手动禁用/启用逻辑
- 别依赖
button[disabled]作为唯一防护,用户删掉 disabled 属性就能绕过 - 事件监听必须用
table.on('toolbar(filterName)'),不是click,否则拿不到obj上下文
正确做法:before + done + 事件内二次校验
以“导出”按钮为例,需三处配合:
- 在
before回调里向 toolbar 容器插入 loading 提示(如<div class="layui-btn-disabled">导出中...</div>) - 在
table.on('toolbar(filterName)')里先判断是否已在 loading 状态(比如用$(this).hasClass('layui-btn-disabled')),是则直接return - 发起请求后,在成功/失败回调里,用
$('.layui-btn-disabled').removeClass('layui-btn-disabled').text('导出')恢复按钮
注意:不要用 $('#toolbar .layui-btn').prop('disabled', true),部分浏览器下 disabled 状态在重绘后会丢失;用 class 控制更稳。
避免 loading 残留的关键点
最常踩的坑是请求失败或超时后忘记清理 loading 状态,导致按钮一直灰着无法再点。
- 所有异步操作(
$.ajax、fetch、layer.load())必须在finally或complete钩子中恢复按钮 - 如果用了
layer.load(2),记得配对调用layer.close(loadIndex),别只靠 success/fail 分支 - 不要在
parseData或done里操作 toolbar 按钮——此时表格 DOM 已更新,但 toolbar 是独立渲染的,时机不对
复杂场景:多个 toolbar 按钮共用 loading 状态
当页面有“导出”“打印”“同步”等多个按钮,且不希望它们同时触发,需要互斥控制。
- 定义一个全局状态对象,如
window.tableToolbarLoading = { export: false, print: false } - 点击前检查对应键是否为
true,是则 return;设为true后再执行逻辑 - 请求结束后设回
false,并统一触发一次按钮文本刷新 - 别用
setTimeout模拟 loading —— 用户网速快时会看到“导出中→导出→导出中”反复跳
真正难的不是加 loading,而是确保它在任何异常路径下都能被清除。网络中断、接口 500、用户连点两次、切换 tab 后回来……这些 case 漏掉一个,loading 就卡死。











