bug 记录 - 使用 el-dialog 的 before-close 的坑

news2025/6/7 0:31:39

需求说明

  • 弹窗中内嵌一个 form 表单
    在这里插入图片描述
  • 原始代码
<script setup lang="ts">
import { reactive, ref } from "vue"
import type { FormRules } from 'element-plus'
const ruleFormRef = ref()
interface RuleForm {
    name: string
    region: 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: string
    region: 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.coloradmin.cn/o/2402285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Next.js 中间件鉴权绕过漏洞 CVE-2025-29927

前言:CVE-2025-29927 是一个影响 Next.js 的严重漏洞&#xff0c;源于开发者信任了客户端请求中携带的 X-Middleware-Rewrite 头部字段。攻击者可以手动构造该头部&#xff0c;实现绕过中间件逻辑&#xff0c;访问本应受保护的资源或 API。 影响版本&#xff1a;Next.js < …

基于YOLO-NAS-Pose的无人机象群姿态估计:群体行为分析的突破

【导读】 应对气候变化对非洲象的生存威胁&#xff0c;本研究创新采用无人机航拍结合AI姿态分析技术&#xff0c;突破传统观测局限。团队在肯尼亚桑布鲁保护区对比测试DeepLabCut与YOLO-NAS-Pose两种模型&#xff0c;首次将后者引入野生动物研究。通过检测象群头部、脊柱等关键…

8天Python从入门到精通【itheima】-71~72(数据容器“序列”+案例练习)

目录 71节-数据容器“序列”的切片 1.学习目标 2.什么是序列 3.序列的常用操作——切片 4.小节总结 72节——案例练习&#xff1a;序列的切片实践 1.案例需求 2.代码实战 好了&#xff0c;又一篇博客和代码写完了&#xff0c;励志一下吧&#xff0c;下一小节等等继续&a…

dvwa10——XSS(DOM)

XSS攻击&#xff1a; DOM型XSS 只在浏览器前端攻击触发&#xff1a;修改url片段代码不存储 反射型XSS 经过服务器攻击触发&#xff1a;可能通过提交恶意表单&#xff0c;连接触发代码不存储 存储型XSS 经由服务器攻击触发&#xff1a;可能通过提交恶意表单&#xff0c;连…

dvwa14——JavaScript

LOW 先按提示尝试输入success&#xff0c;提交失败 那用bp抓包一下 &#xff0c;抓到这些&#xff0c;发现有token验证&#xff0c;说明改对token才能过 返回页面f12看一下源码&#xff0c;发现value后面的值像密码&#xff0c;于是试一下md5和rot13的解密 ROT13加密/解密 - …

机器学习实验八--基于pca的人脸识别

基于pca的人脸识别 引言&#xff1a;pca1.pca是什么2.PCA算法的基本步骤 实例&#xff1a;人脸识别1.实验目的2.实现步骤3.代码实现4.实验结果5.实验总结 引言&#xff1a;pca 1.pca是什么 pca是一种统计方法&#xff0c;它可以通过正交变换将一组可能相关的变量转换成一组线…

LabVIEW的AMC架构解析

此LabVIEW 程序基于消息队列&#xff08;Message Queue&#xff09;机制构建 AMC 架构&#xff0c;核心包含消息生成&#xff08;MessageGenerator &#xff09;与消息处理&#xff08;Message Processor &#xff09;两大循环&#xff0c;通过队列传递事件与指令&#xff0c;实…

MySQL 索引:为使用 B+树作为索引数据结构,而非 B树、哈希表或二叉树?

在数据库的世界里&#xff0c;性能是永恒的追求。而索引&#xff0c;作为提升查询速度的利器&#xff0c;其底层数据结构的选择至关重要。如果你深入了解过 MySQL&#xff08;尤其是其主流存储引擎 InnoDB&#xff09;&#xff0c;你会发现它不约而同地选择了 B树 作为索引的主…

ubuntu屏幕复制

在ubnuntu20中没有办法正常使用镜像功能,这里提供一下复制屏幕的操作. 使用xrandr查看所有的显示器情况 这里我发现自己的电脑没有办法直接设置分辨率,但是外接的显示器可以设置,从命令行来说就是设置: xrandr --output HDMI-0 --mode 1920x1080那怎么样才能将原生电脑屏幕换…

Spring WebFlux 整合AI大模型实现流式输出

前言 最近赶上AI的热潮&#xff0c;很多业务都在接入AI大模型相关的接口去方便的实现一些功能&#xff0c;后端需要做的是接入AI模型接口&#xff0c;并整合成流式输出到前端&#xff0c;下面有一些经验和踩过的坑。 集成 Spring WebFlux是全新的Reactive Web技术栈&#xf…

验证电机理论与性能:电机试验平板提升测试效率

电机试验平板提升测试效率是验证电机理论与性能的重要环节之一。通过在平板上进行电机试验&#xff0c;可以对电机的性能参数进行准确测量和分析&#xff0c;从而验证电机的理论设计是否符合实际表现。同时&#xff0c;提升测试效率可以加快试验过程&#xff0c;节约时间和成本…

Simplicity studio SDK下载和安装,创建工程

下载SDK工具地址 Simplicity Studio - Silicon Labs 选择适合自己电脑的版本。 这个就使用你自己的邮箱注册一个就可以了&#xff0c;我是用的公司邮箱注册的。 下载完成&#xff1a; 安装 下载完成后右键点击安装&#xff0c;一路下一步 安装完成后&#xff0c;程序自动打…

OpenCV——Mac系统搭建OpenCV的Java环境

这里写目录标题 一、源码编译安装1.1、下载源码包1.2、cmake安装1.3、java配置1.4、测试 二、Maven引入2.1、添加Maven依赖2.2、加载本地库 一、源码编译安装 1.1、下载源码包 官网下载opencv包&#xff1a;https://opencv.org/releases/ 以4.6.0为例&#xff0c;下载解压后&…

【设计模式-3.4】结构型——代理模式

说明&#xff1a;说明&#xff1a;本文介绍结构型设计模式之一的代理模式 定义 代理模式&#xff08;Proxy Pattern&#xff09;指为其他对象提供一种代理&#xff0c;以控制对这个对象的访问&#xff0c;属于结构型设计模式。&#xff08;引自《设计模式就该这样学》P158&am…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Sound Board(音响控制面板)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— SoundBoard 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ &#x1f3af; 组件目标 实现一个响应式按钮面板&#xff0c;点…

关于大数据的基础知识(一)——定义特征结构要素

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于大数据的基础知识&#xff08;一&a…

chrome使用手机调试触屏web

chrome://inspect/#devices 1、手机开启调试模式、打开usb调试 2、手机谷歌浏览器打开网站 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f1ef2d2c017c477ba55a57338ae13fc8.jpeg#pic_center 使用谷歌浏览器打开chrome://inspect/#devices 刷新浏览器点击inspect…

python版若依框架开发:项目结构解析

python版若依框架开发 从0起步&#xff0c;扬帆起航。 python版若依部署代码生成指南&#xff0c;迅速落地CURD&#xff01;项目结构解析 文章目录 python版若依框架开发前端后端 前端 后端

day34- 系统编程之 网络编程(TCP)

一、补充 ip地址:除了本机地址如&#xff1a;192.168.0.151还可以使用&#xff08;自己测试&#xff09;本地回环地址&#xff08;127.0.0.1&#xff09;或者使用htonl(INADDR_ANY)&#xff1b; 二、模式 C/S 模式 ->服务器/客户端模型&#xff1a;TCP传输控制协议 2.1 …

鸿蒙jsonToArkTS_工具exe版本来了

前言导读 相信大家在学习鸿蒙开发过程中最痛苦的就是编写model 类 特别是那种复杂的json的时候对不对&#xff0c; 这时候有一个自动化的工具给你生成model是不是很开心。我们今天要分享的就是这个工具 JsonToArkTs 的用法 工具地址 https://gitee.com/qiuyu123/jsontomodel…