Vue3 el-switch @change事件在初始化时会自动调用问题处理的多种方法
更新时间:2025年07月07日 09:33:28 作者: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事件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Vue2.x如何解决Element组件el-tooltip滚动时错位不消失的问题
这篇文章主要介绍了Vue2.x如何解决Element组件el-tooltip滚动时错位不消失的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-06-06
详解Vue webapp项目通过HBulider打包原生APP
这篇文章主要介绍了详解Vue webapp项目通过HBulider打包原生APP,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-06-06
vue中实现支持txt,docx,xlsx,mp4格式文件预览功能(纯前端)
对于Vue你可以实现文件的预览功能,这篇文章主要给大家介绍了关于vue中实现支持txt,docx,xlsx,mp4格式文件预览功能的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下2023-11-11
Vue + Element UI 实现权限管理系统之菜单功能实现代码
菜单管理是一个对菜单树结构的增删改查操作,这篇文章主要介绍了Vue + Element UI 实现权限管理系统之菜单功能实现代码,需要的朋友可以参考下2022-02-02
vue利用vue meta info设置每个页面的title与meta信息
这篇文章主要给大家介绍了关于vue如何利用vue meta info设置每个页面的title与meta信息的相关资料,文中将实现的方法介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友可以参考下2021-10-10


最新评论