bug 記錄 - 使用 el-dialog 的 before-close 的坑

需求說明

  • 彈窗中內嵌一個 form 表單
    在這里插入圖片描述
  • 原始代碼
<script setup lang="ts">
import { reactive, ref } from "vue"
import type { FormRules } from 'element-plus'
const ruleFormRef = ref()
interface RuleForm {name: stringregion: number | null
}
const ruleForm = reactive<RuleForm>({name: '',region: null,
})
const rules = reactive<FormRules<RuleForm>>({name: [{ required: true, message: '請填寫姓名', trigger: 'blur' },],region: [{ required: true, message: '請選擇區域編碼', trigger: 'change' },]
})
const dialogVisible = ref(false);
function handelDialogPop(type: string) {if (type == "open") {dialogVisible.value = true; // 開啟彈窗} else if (type == "submit") {ruleFormRef.value.validate((valid: any, fields: any) => {if (valid) {console.log('提交成功')// 關閉彈窗ruleFormRef.value.resetFields();dialogVisible.value = false;} else {console.log('error submit!', fields)}})} else if (type == "cancel") {// 關閉彈窗ruleFormRef.value.resetFields();dialogVisible.value = false}
}
</script>
<template><div class="dataBox"><el-button type="primary" @click="handelDialogPop('open')">開啟彈窗</el-button><el-dialog v-model="dialogVisible" title="彈窗" width="500"><el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="auto"><el-form-item label="姓名" prop="name"><el-input v-model="ruleForm.name" /></el-form-item><el-form-item label="區域" prop="region"><el-select v-model="ruleForm.region" placeholder="區域編碼"><el-option label="第一區" :value="1" /><el-option label="第二區" :value="2" /></el-select></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button type="primary" plain @click="handelDialogPop('cancel')">取消</el-button><el-button type="primary" @click="handelDialogPop('submit')">提交</el-button></div></template></el-dialog></div>
</template>
  • 點擊取消按鈕,或者提交通過校驗時,先執行了 form 表單的 resetFields 事件。此代碼會將表單的值重置為初始值,并且移除所有校驗。這樣可以保證下次點開彈窗時,不會保留上次操作 form 的痕跡。
    在這里插入圖片描述
  • 為了省事兒,我把所有對 dialog 的操作都寫進了 handelDialogPop 函數里,傳入 type 來區分是什么事件(這里就是出問題的關鍵

發現問題

  • 手動點擊關閉按鈕,或者點擊 model 空白區域時,彈窗被關閉。未執行 form 表單的 resetFields 方法,所以再次打開時,彈窗保留了上次操作的痕跡(form 表單未重置)
    在這里插入圖片描述

  • 因此需要監聽 dialog 的關閉事件,官方提供了一個方法,before-close
    在這里插入圖片描述

<el-dialog v-model="dialogVisible" title="彈窗" width="500" :before-close="handelDialogPop('cancel')">
...
  • 問題出現了,一進入頁面時,直接拋錯。報錯信息可看出,before-close 被觸發了

在這里插入圖片描述

在這里插入圖片描述

問題解決

  • 文檔中表明,before-close 傳參,done 說明會執行。
    在這里插入圖片描述
  • 重新為 before-close 封裝一個函數

在這里插入圖片描述

完整代碼

<script setup lang="ts">
import { reactive, ref } from "vue"
import type { FormRules } from 'element-plus'
const ruleFormRef = ref()
interface RuleForm {name: stringregion: number | null
}
const ruleForm = reactive<RuleForm>({name: '',region: null,
})
const rules = reactive<FormRules<RuleForm>>({name: [{ required: true, message: '請填寫姓名', trigger: 'blur' },],region: [{ required: true, message: '請選擇區域編碼', trigger: 'change' },]
})
const dialogVisible = ref(false);
function beforeCloseDialog() {console.log("執行了 beforeCloseDialog");ruleFormRef.value.resetFields();dialogVisible.value = false
}
function handelDialogPop(type: string) {if (type == "open") {dialogVisible.value = true} else if (type == "submit") {ruleFormRef.value.validate((valid: any, fields: any) => {if (valid) {console.log('提交成功')beforeCloseDialog();} else {console.log('error submit!', fields)}})} else if (type == "cancel") {// 關閉彈窗beforeCloseDialog()}
}
</script>
<template><div class="dataBox"><el-button type="primary" @click="handelDialogPop('open')">開啟彈窗</el-button><el-dialog v-model="dialogVisible" title="彈窗" width="500" :before-close="beforeCloseDialog"><el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="auto"><el-form-item label="姓名" prop="name"><el-input v-model="ruleForm.name" /></el-form-item><el-form-item label="區域" prop="region"><el-select v-model="ruleForm.region" placeholder="區域編碼"><el-option label="第一區" :value="1" /><el-option label="第二區" :value="2" /></el-select></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button type="primary" plain @click="handelDialogPop('cancel')">取消</el-button><el-button type="primary" @click="handelDialogPop('submit')">提交</el-button></div></template></el-dialog></div>
</template>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84228.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84228.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84228.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關鍵領域軟件測試的突圍之路:如何破解安全與效率的平衡難題

在數字化浪潮席卷全球的今天&#xff0c;軟件系統已成為國家關鍵領域的核心戰斗力。不同于普通商業軟件&#xff0c;這些承載著國家安全使命的軟件系統面臨著前所未有的質量挑戰——如何在確保絕對安全的前提下&#xff0c;實現高效測試與快速迭代&#xff1f;這一命題正考驗著…

老年生活照護實訓室建設規劃:照護質量評估與持續改進實訓體系

隨著人口老齡化程度的不斷加深&#xff0c;老年生活照護需求日益增長&#xff0c;對專業照護人才的培養提出了更高要求。老年生活照護實訓室建設方案作為培養高素質照護人才的重要載體&#xff0c;其核心在于構建科學完善的照護質量評估與持續改進實訓體系。通過該體系的建設&a…

Ctrl-Crash 助力交通安全:可控生成逼真車禍視頻,防患于未然

視頻擴散技術雖發展顯著&#xff0c;但多數駕駛數據集事故事件少&#xff0c;難以生成逼真車禍圖像&#xff0c;而提升交通安全又急需逼真可控的事故模擬。為此&#xff0c;論文提出可控車禍視頻生成模型 Ctrl-Crash&#xff0c;它以邊界框、碰撞類型、初始圖像幀等為條件&…

jieba實現和用RNN實現中文分詞的區別

Jieba 分詞和基于 RNN 的分詞在技術路線、實現機制、性能特點上有顯著差異&#xff0c;以下是核心對比&#xff1a; 1. 技術路線對比 維度Jieba 分詞RNN 神經網絡分詞范式傳統 NLP&#xff08;規則 統計&#xff09;深度學習&#xff08;端到端學習&#xff09;核心依賴詞典…

excel數據對比找不同:6種方法核對兩列數據差異

工作中&#xff0c;有時需要核對兩列數據的差異&#xff0c;用于對比、復核等。數據較少的情況下差異肉眼可見&#xff0c;數據量較大時用什么方法比較好呢&#xff1f;從個人習慣出發&#xff0c;我整理了6種方法供參考。 6種方法核對兩列數據差異&#xff1a; 1、Ctrl G定位…

C# 表達式和運算符(求值順序)

求值順序 表達式可以由許多嵌套的子表達式構成。子表達式的求值順序可以使表達式的最終值發生 變化。 例如&#xff0c;已知表達式3*52&#xff0c;依照子表達式的求值順序&#xff0c;有兩種可能的結果&#xff0c;如圖9-3所示。 如果乘法先執行&#xff0c;結果是17。如果5…

高頻面試之3Zookeeper

高頻面試之3Zookeeper 文章目錄 高頻面試之3Zookeeper3.1 常用命令3.2 選舉機制3.3 Zookeeper符合法則中哪兩個&#xff1f;3.4 Zookeeper腦裂3.5 Zookeeper用來干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 選舉機制 半數機制&#xff08;過半機制&#xff0…

CppCon 2015 學習:Simple, Extensible Pattern Matching in C++14

什么是 Pattern Matching&#xff08;模式匹配&#xff09; ? 模式匹配就是一種“描述式”的寫法&#xff0c;不需要你手動判斷、提取數據&#xff0c;而是直接描述你希望的數據結構是什么樣子&#xff0c;系統自動判斷并提取。? 你給的定義拆解&#xff1a; ? Instead of …

刷題記錄(7)二叉樹

一、單值二叉樹 二叉樹為二叉鏈表形式&#xff0c;結點為&#xff1a; 大概看看題就知道這道題讓我們判斷一個樹到底所有結點的值是不是相同&#xff0c;相同就是單值二叉樹。在實現二叉樹相關操作的時候已經體會到了&#xff0c;遞歸來遍歷二叉樹是非常舒服的&#xff08;做這…

開源:FTP同步工具

文章目錄 簡介功能特性Windows (EXE)從源代碼構建依賴項Linux 構建Windows 構建 使用方法軟件截圖主界面FTP 設置快捷菜單定時設置 配置說明開發與貢獻許可證 歡迎來到盹貓的博客 本篇文章主要介紹了 [開源:FTP同步工具] ?博主廣交技術好友&#xff0c;喜歡我的文章的可以關注…

視頻質量測試點

目錄 功能/UI 端側性能 媒體質量 主觀 客觀 穩定性 兼容性 功能/UI 視頻預覽音頻預覽音視頻同步全屏收藏打賞 端側性能 PC端&#xff1a;內存占用、網絡帶寬占用等&#xff1b; 移動端&#xff1a;內存占用、功耗、發熱、流量消耗等&#xff1b; 媒體質量 主觀 音…

Ray框架:分布式AI訓練與調參實踐

Ray框架&#xff1a;分布式AI訓練與調參實踐 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 Ray框架&#xff1a;分布式AI訓練與調參實踐摘要引言框架架構解析1. 核心組件設計2. 關鍵技術實現2.1 動態資源調度2.2 …

成都鼎訊硬核科技!雷達目標與干擾模擬器,以卓越性能制勝電磁頻譜戰

在現代戰爭中&#xff0c;電磁頻譜已成為繼陸、海、空、天之后的 “第五維戰場”&#xff0c;雷達作為電磁頻譜領域的關鍵裝備&#xff0c;其干擾與抗干擾能力的較量&#xff0c;直接影響著戰爭的勝負走向。由成都鼎訊科技匠心打造的雷達目標與干擾模擬器&#xff0c;憑借數字射…

ubuntu22.04 安裝docker 和docker-compose

首先你要確保沒有docker環境或者使用命令刪掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安裝docker 更新軟件環境 sudo apt update sudo apt upgrade下載docker依賴和GPG 密鑰 # 依賴 apt-get install ca-certificates curl gnupg lsb-rel…

2025 后端自學UNIAPP【項目實戰:旅游項目】6、我的收藏頁面

代碼框架視圖 1、先添加一個獲取收藏景點的列表請求 【在文件my_api.js文件中添加】 // 引入公共的請求封裝 import http from ./my_http.js// 登錄接口&#xff08;適配服務端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…

20250609在榮品的PRO-RK3566開發板的Android13下解決串口可以執行命令但是腳本執行命令異常的問題

20250609在榮品的PRO-RK3566開發板的Android13下解決串口可以執行命令但是腳本執行命令異常的問題 2025/6/9 20:54 緣起&#xff0c;為了跨網段推流&#xff0c;千辛萬苦配置好了網絡參數。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在調試串口/DEBUG口正確執行。…

【C/C++】高效的位操作

位運算&#xff08;Bitwise Operation&#xff09;是直接對整數的二進制位進行操作的運算方式&#xff0c;在底層開發、性能優化、算法設計中廣泛使用。 1 基本位運算符及含義 運算符名稱示例&#xff08;a5, b3&#xff09;運算過程&#xff08;二進制&#xff09;結果&按…

后端下載限速(redis記錄實時并發,bucket4j動態限速)

? 使用 Redis 記錄 所有用戶的實時并發下載數? 使用 Bucket4j 實現 全局下載速率限制&#xff08;動態&#xff09;? 支持 動態調整限速策略? 下載接口安全、穩定、可監控 &#x1f9e9; 整體架構概覽 模塊功能Redis存儲全局并發數和帶寬令牌桶狀態Bucket4j Redis分布式限…

android app 一個 crash的解決過程!

一、日志&#xff1a; crash 2024-10-25 12:15:33.020 2113-2113 AndroidRuntime pid-2113 E FATAL EXCEPTION: main Process: com..workhome, PID: 2113 java.lang.RuntimeException: Unable to start activity ComponentInfo{com..w…

[Java 基礎]Object 類

java.lang.Object 是 Java 所有類的直接或間接父類&#xff0c;Java 中每個類都默認繼承 Object 類&#xff08;即使你沒寫 extends Object&#xff09;。 Object 中的常用方法&#xff1a; 方法名功能簡介toString()返回對象的字符串表示equals(Object)判斷兩個對象是否“邏…