二次确认弹窗连续点击怎么阻止重复提交?
我在做一个订单删除功能,用了二次确认弹窗,但用户如果连续快速点击删除按钮,会连续弹出多个确认框。试过给按钮加disabled属性,但因为确认框是同步弹出的,按钮样式没及时更新。用过setTimeout延迟禁用,又导致交互有延迟感。
现在用的是这样的逻辑:
deleteOrder() {
if (confirm('确定删除?')) {
// 发起删除请求
this.disableButton();
api.delete(orderId).finally(() => this.enableButton());
}
}
问题在于取消确认后按钮依然会禁用,而且多个按钮实例会互相影响状态。有什么更好的方案能彻底阻止连续点击,同时保持界面反馈自然?
你现在的 confirm 写法已经卡死主线程了,根本来不及渲染 disabled 状态。换成 modal 弹窗组件(比如 Element UI 的 MessageBox 或自己封装一个),返回 Promise,这样能保证按钮状态先更新。
核心思路是:点击时立刻禁用按钮并记录状态,等弹窗有结果后再恢复。代码差不多这样:
如果你不想依赖 UI 框架的 $confirm,自己写个简单的也行,关键是用 Promise 封装确认动作,别用原生 confirm。
还有一个更激进但性能更好的方式:用一个 WeakMap 存储按钮和 pending 状态,避免多个实例互相影响。不过一般场景上面就够了。
总之记住一点:原生 confirm 别用了,它没法和 DOM 更新同步,必然导致样式滞后和多弹窗问题。换成异步 modal,流程可控,性能也稳。