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事件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解IOS微信上Vue单页面应用JSSDK签名失败解决方案

    详解IOS微信上Vue单页面应用JSSDK签名失败解决方案

    这篇文章主要介绍了详解IOS微信上Vue单页面应用JSSDK签名失败解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • vue通过子组件修改父组件prop的多种实现方式

    vue通过子组件修改父组件prop的多种实现方式

    这篇文章主要介绍了vue通过子组件修改父组件prop的几种实现方式,比较常用的方式是通过Prop单向传递的规则,需要的朋友可以参考下
    2021-09-09
  • Vue3中Hooks函数的使用及封装思想详解

    Vue3中Hooks函数的使用及封装思想详解

    Vue 3中的Hooks函数是一种用于在组件中共享可复用逻辑的方式,简单来说,就是将单独功能的js代码抽离出来, 加工成公共函数,从而达到逻辑复用,下面小编就来和大家聊聊Hooks函数的使用及封装思想吧
    2023-06-06
  • vue3项目如何国际化实战指南

    vue3项目如何国际化实战指南

    像很多大型的网址,特别是跨国际等公司网页,访问来自世界各地用户,所以网页的国际化极其重要的需求,下面这篇文章主要给大家介绍了关于vue3项目如何国际化的相关资料,需要的朋友可以参考下
    2022-09-09
  • 基于Vue3+ts封装一个简单版的Message组件

    基于Vue3+ts封装一个简单版的Message组件

    近日项目中需要使用信息提示框的功能,ui组件库使用的是字节的arco-design-vue,看了一下,现有的Message不满足要是需求,直接使用message组件的话,改样式太麻烦,所以本文就本就介绍了基于Vue3+ts封装一个简单版的Message组件,需要的朋友可以参考下
    2023-09-09
  • Vue3中10多种组件通讯方法小结

    Vue3中10多种组件通讯方法小结

    本文主要介绍了Vue3中10多种组件通讯方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 解决vue3中内存泄漏的问题

    解决vue3中内存泄漏的问题

    在项目中会发现一个奇怪的现象,当我们在使用element-plus中的图标组件时会出现内存泄漏,所以本文讲给大家讲讲如何解决vue3中的内存泄漏的问题,需要的朋友可以参考下
    2023-07-07
  • Vue自定义弹窗指令的实现代码

    Vue自定义弹窗指令的实现代码

    使用vue2.0实现自定义弹窗指令,当标签有该指令时,点击标签可以弹出弹窗。下面通过实例代码给大家介绍Vue自定义弹窗指令的相关知识,感兴趣的朋友一起看看吧
    2018-08-08
  • 关于Vite项目打包后浏览器兼容性问题的解决方案

    关于Vite项目打包后浏览器兼容性问题的解决方案

    本文主要介绍了关于Vite项目打包后浏览器兼容性问题的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Nuxt页面级缓存的实现

    Nuxt页面级缓存的实现

    这篇文章主要介绍了Nuxt页面级缓存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论