欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3 el-switch @change事件在初始化時(shí)會(huì)自動(dòng)調(diào)用問(wèn)題處理的多種方法

 更新時(shí)間:2025年07月07日 09:33:28   作者:JaysonJin  
本文介紹Vue3中Switch切換確認(rèn)彈窗的兩種實(shí)現(xiàn)方法:方法一通過(guò)before-change攔截器精準(zhǔn)控制(推薦);方法二用初始化狀態(tài)標(biāo)識(shí)兼容舊項(xiàng)目,并提供統(tǒng)一封裝方案,適用于ElementPlus/NaiveUI等組件,感興趣的朋友一起看看吧

?? Vue3 實(shí)現(xiàn) Switch 狀態(tài)切換確認(rèn)彈窗的兩種方法(含完整代碼)

?? 適用于:Element Plus / Naive UI 等 Switch 開(kāi)關(guān)組件
?? 場(chǎng)景:用戶點(diǎn)擊開(kāi)關(guān)前先彈出確認(rèn)彈窗,防止誤操作

? 方法一:使用before-change攔截器(推薦)

? 原理說(shuō)明:

  • 使用 Switch 組件的 before-change 屬性攔截切換
  • 返回 false 阻止?fàn)顟B(tài)變更
  • 彈出確認(rèn)框后再手動(dòng)執(zhí)行狀態(tài)修改 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; // 阻止切換
  }
};

?? 注意事項(xiàng):

  • before-change 要求返回 boolean | Promise<boolean>
  • 如果 Promise 被 reject 或返回 false,則阻止?fàn)顟B(tài)切換
  • 適合 Element Plus、Naive UI、TDesign 等支持此屬性的組件

? 方法二:利用“初始化狀態(tài)”標(biāo)識(shí)判斷(兼容性方案)

? 原理說(shuō)明:

  • 初始化階段不執(zhí)行彈窗
  • 后續(xù)用戶手動(dòng)點(diǎn)擊再執(zhí)行確認(rèn)邏輯
  • 用于不支持 before-change 的組件或舊項(xiàng)目兼容

?? 示例代碼:

<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(() => {
      // 用戶取消后回滾狀態(tài)
      row.status = row.status === "0" ? "1" : "0";
    });
};

?? 注意事項(xiàng):

  • isInit 適合用于組件首次渲染跳過(guò)
  • 缺點(diǎn)是狀態(tài)回滾不如 before-change 精準(zhǔn),需手動(dòng)回改值

? 總結(jié)對(duì)比

方法優(yōu)點(diǎn)缺點(diǎn)場(chǎng)景
? 方法一:before-change原生支持、邏輯清晰、控制精準(zhǔn)需組件支持Vue3 + Element Plus/Naive UI 推薦
方法二:狀態(tài)標(biāo)識(shí)控制無(wú)需組件支持、兼容性好狀態(tài)回滾需手動(dòng)處理,首次需跳過(guò)舊項(xiàng)目、無(wú) before-change 的組件

?? Bonus:統(tǒng)一封裝 Switch 彈窗邏輯

可封裝為一個(gè)公共方法,在多個(gè)組件中復(fù)用:

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;
  }
};

到此這篇關(guān)于Vue3 el-switch @change事件在初始化時(shí)會(huì)自動(dòng)調(diào)用問(wèn)題處理的幾種方法的文章就介紹到這了,更多相關(guān)Vue3 el-switch @change事件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

    對(duì)于Vue為何采用異步渲染,簡(jiǎn)單來(lái)說(shuō)就是為了提升性能,因?yàn)椴徊捎卯惒礁?,在每次更新?shù)據(jù)都會(huì)對(duì)當(dāng)前組件進(jìn)行重新渲染,為了性能考慮,Vue會(huì)在本輪數(shù)據(jù)更新后,再去異步更新視圖,本文主要通過(guò)幾個(gè)實(shí)例給大家介紹一下Vue為何采用異步渲染,需要的朋友可以參考下
    2023-06-06
  • vue項(xiàng)目中如何配置env環(huán)境的實(shí)現(xiàn)

    vue項(xiàng)目中如何配置env環(huán)境的實(shí)現(xiàn)

    本文主要介紹了vue項(xiàng)目中如何配置env環(huán)境的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Vue2.x如何解決Element組件el-tooltip滾動(dòng)時(shí)錯(cuò)位不消失的問(wèn)題

    Vue2.x如何解決Element組件el-tooltip滾動(dòng)時(shí)錯(cuò)位不消失的問(wèn)題

    這篇文章主要介紹了Vue2.x如何解決Element組件el-tooltip滾動(dòng)時(shí)錯(cuò)位不消失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Vue3時(shí)間軸組件問(wèn)題記錄(時(shí)間信息收集組件)

    Vue3時(shí)間軸組件問(wèn)題記錄(時(shí)間信息收集組件)

    本文介紹了如何在Vue3項(xiàng)目中封裝一個(gè)時(shí)間信息收集組件,采用雙向綁定響應(yīng)式數(shù)據(jù),通過(guò)對(duì)Element-Plus的Slider組件二次封裝,實(shí)現(xiàn)時(shí)間軸功能,解決了小數(shù)計(jì)算導(dǎo)致匹配問(wèn)題和v-model綁定組件無(wú)效問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • vuecli項(xiàng)目構(gòu)建SSR服務(wù)端渲染的實(shí)現(xiàn)

    vuecli項(xiàng)目構(gòu)建SSR服務(wù)端渲染的實(shí)現(xiàn)

    這篇文章主要介紹了vuecli項(xiàng)目構(gòu)建SSR服務(wù)端渲染的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 詳解Vue webapp項(xiàng)目通過(guò)HBulider打包原生APP

    詳解Vue webapp項(xiàng)目通過(guò)HBulider打包原生APP

    這篇文章主要介紹了詳解Vue webapp項(xiàng)目通過(guò)HBulider打包原生APP,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • vue中實(shí)現(xiàn)支持txt,docx,xlsx,mp4格式文件預(yù)覽功能(純前端)

    vue中實(shí)現(xiàn)支持txt,docx,xlsx,mp4格式文件預(yù)覽功能(純前端)

    對(duì)于Vue你可以實(shí)現(xiàn)文件的預(yù)覽功能,這篇文章主要給大家介紹了關(guān)于vue中實(shí)現(xiàn)支持txt,docx,xlsx,mp4格式文件預(yù)覽功能的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Vue + Element UI 實(shí)現(xiàn)權(quán)限管理系統(tǒng)之菜單功能實(shí)現(xiàn)代碼

    Vue + Element UI 實(shí)現(xiàn)權(quán)限管理系統(tǒng)之菜單功能實(shí)現(xiàn)代碼

    菜單管理是一個(gè)對(duì)菜單樹(shù)結(jié)構(gòu)的增刪改查操作,這篇文章主要介紹了Vue + Element UI 實(shí)現(xiàn)權(quán)限管理系統(tǒng)之菜單功能實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2022-02-02
  • vue利用vue meta info設(shè)置每個(gè)頁(yè)面的title與meta信息

    vue利用vue meta info設(shè)置每個(gè)頁(yè)面的title與meta信息

    這篇文章主要給大家介紹了關(guān)于vue如何利用vue meta info設(shè)置每個(gè)頁(yè)面的title與meta信息的相關(guān)資料,文中將實(shí)現(xiàn)的方法介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-10-10
  • vue項(xiàng)目如何讓局域網(wǎng)ip訪問(wèn)配置設(shè)置

    vue項(xiàng)目如何讓局域網(wǎng)ip訪問(wèn)配置設(shè)置

    這篇文章主要介紹了vue項(xiàng)目如何讓局域網(wǎng)ip訪問(wèn)配置設(shè)置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-09-09

最新評(píng)論