Vue3 el-switch @change事件在初始化时会自动调用问题处理的多种方法
作者:JaysonJin
本文介绍Vue3中Switch切换确认弹窗的两种实现方法:方法一通过before-change拦截器精准控制(推荐);方法二用初始化状态标识兼容旧项目,并提供统一封装方案,适用于ElementPlus/NaiveUI等组件,感兴趣的朋友一起看看吧
💡 Vue3 实现 Switch 状态切换确认弹窗的两种方法(含完整代码)
🔧 适用于:Element Plus / Naive UI 等 Switch 开关组件
📌 场景:用户点击开关前先弹出确认弹窗,防止误操作
✨ 方法一:使用before-change拦截器(推荐)
✅ 原理说明:
- 使用 Switch 组件的
before-change
属性拦截切换 - 返回
false
阻止状态变更 - 弹出确认框后再手动执行状态修改 API
📦 示例代码:
<el-switch v-model="item.status" :active-value="'1'" :inactive-value="'0'" :before-change="() => handleBeforeChange(item)" />
const handleBeforeChange = async (row: any) => { const text = row.status === "0" ? "启用" : "停用"; try { await proxy.$modal.confirm(`确定要${text}“${row.userName}”用户吗?`); await changeUserStatus(row.userId, row.status); proxy.$modal.msgSuccess(`${text}成功`); return true; } catch (err) { return false; // 阻止切换 } };
📘 注意事项:
before-change
要求返回boolean | Promise<boolean>
- 如果 Promise 被 reject 或返回
false
,则阻止状态切换 - 适合 Element Plus、Naive UI、TDesign 等支持此属性的组件
⚙ 方法二:利用“初始化状态”标识判断(兼容性方案)
✅ 原理说明:
- 初始化阶段不执行弹窗
- 后续用户手动点击再执行确认逻辑
- 用于不支持
before-change
的组件或旧项目兼容
📦 示例代码:
<el-switch v-model="item.status" :active-value="'1'" :inactive-value="'0'" @change="() => handleStatusChange(item)" />
let isInit = true; const handleStatusChange = (row: any) => { if (isInit) { isInit = false; return; } const text = row.status === "0" ? "启用" : "停用"; proxy.$modal.confirm(`确定要${text}“${row.userName}”用户吗?`) .then(() => { return changeUserStatus(row.userId, row.status); }) .then(() => { proxy.$modal.msgSuccess(`${text}成功`); }) .catch(() => { // 用户取消后回滚状态 row.status = row.status === "0" ? "1" : "0"; }); };
📘 注意事项:
isInit
适合用于组件首次渲染跳过- 缺点是状态回滚不如
before-change
精准,需手动回改值
✅ 总结对比
方法 | 优点 | 缺点 | 场景 |
---|---|---|---|
✅ 方法一:before-change | 原生支持、逻辑清晰、控制精准 | 需组件支持 | Vue3 + Element Plus/Naive UI 推荐 |
方法二:状态标识控制 | 无需组件支持、兼容性好 | 状态回滚需手动处理,首次需跳过 | 旧项目、无 before-change 的组件 |
🧪 Bonus:统一封装 Switch 弹窗逻辑
可封装为一个公共方法,在多个组件中复用:
export const confirmSwitch = async (row, title, doChange: () => Promise<any>) => { try { await proxy.$modal.confirm(title); await doChange(); proxy.$modal.msgSuccess("操作成功"); return true; } catch (e) { return false; } };
到此这篇关于Vue3 el-switch @change事件在初始化时会自动调用问题处理的几种方法的文章就介绍到这了,更多相关Vue3 el-switch @change事件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!