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

相关文章

  • Vue采用异步渲染的原理分析

    Vue采用异步渲染的原理分析

    对于Vue为何采用异步渲染,简单来说就是为了提升性能,因为不采用异步更新,在每次更新数据都会对当前组件进行重新渲染,为了性能考虑,Vue会在本轮数据更新后,再去异步更新视图,本文主要通过几个实例给大家介绍一下Vue为何采用异步渲染,需要的朋友可以参考下
    2023-06-06
  • vue项目中如何配置env环境的实现

    vue项目中如何配置env环境的实现

    本文主要介绍了vue项目中如何配置env环境的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Vue2.x如何解决Element组件el-tooltip滚动时错位不消失的问题

    Vue2.x如何解决Element组件el-tooltip滚动时错位不消失的问题

    这篇文章主要介绍了Vue2.x如何解决Element组件el-tooltip滚动时错位不消失的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Vue3时间轴组件问题记录(时间信息收集组件)

    Vue3时间轴组件问题记录(时间信息收集组件)

    本文介绍了如何在Vue3项目中封装一个时间信息收集组件,采用双向绑定响应式数据,通过对Element-Plus的Slider组件二次封装,实现时间轴功能,解决了小数计算导致匹配问题和v-model绑定组件无效问题,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • vuecli项目构建SSR服务端渲染的实现

    vuecli项目构建SSR服务端渲染的实现

    这篇文章主要介绍了vuecli项目构建SSR服务端渲染的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 详解Vue webapp项目通过HBulider打包原生APP

    详解Vue webapp项目通过HBulider打包原生APP

    这篇文章主要介绍了详解Vue webapp项目通过HBulider打包原生APP,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • vue中实现支持txt,docx,xlsx,mp4格式文件预览功能(纯前端)

    vue中实现支持txt,docx,xlsx,mp4格式文件预览功能(纯前端)

    对于Vue你可以实现文件的预览功能,这篇文章主要给大家介绍了关于vue中实现支持txt,docx,xlsx,mp4格式文件预览功能的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Vue + Element UI 实现权限管理系统之菜单功能实现代码

    Vue + Element UI 实现权限管理系统之菜单功能实现代码

    菜单管理是一个对菜单树结构的增删改查操作,这篇文章主要介绍了Vue + Element UI 实现权限管理系统之菜单功能实现代码,需要的朋友可以参考下
    2022-02-02
  • vue利用vue meta info设置每个页面的title与meta信息

    vue利用vue meta info设置每个页面的title与meta信息

    这篇文章主要给大家介绍了关于vue如何利用vue meta info设置每个页面的title与meta信息的相关资料,文中将实现的方法介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友可以参考下
    2021-10-10
  • vue项目如何让局域网ip访问配置设置

    vue项目如何让局域网ip访问配置设置

    这篇文章主要介绍了vue项目如何让局域网ip访问配置设置,具有很好的参考价值,希望对大家有所帮助。
    2022-09-09

最新评论