element-plus弹窗二次封装踩坑

server/2024/11/28 14:39:35/

1 基于element-plus的二次封装弹窗很常见。代码如下:

父组件:

import Dialog from './components/Dialogs/testDailog.vue'const show=ref(false)
const openDialog=()=>{show.value=true}<button @click="openDialog" >打开dialoag</button>
<Dialog   v-model="show"/>

弹窗的内容:

<template><el-dialogv-model="visible"title="Tips"width="30%"@close="handerClose"><P>This is a message</P><P>This is a message</P><P>This is a message</P><P>This is a message</P><P>This is a message</P><P>This is a message</P><P>This is a message</P><el-button @click="cancel">取消</el-button><el-button @click="confirm">确定</el-button></el-dialog>
</template><script setup lang='ts'>import { ref, reactive, watch, onMounted, onUnmounted } from 'vue'const emits=defineEmits(['close','confirm','update:modelValue'])const props=defineProps({modelValue:{type:Boolean,default:false}
})
const visible=ref(false)const cancel=()=>{emits('update:modelValue',false)
}
const confirm=()=>{emits('update:modelValue',false)
}const handerClose=()=>{console.log("点击关闭按钮");emits('update:modelValue',false)
}watch(()=>props.modelValue,(newVal)=>{visible.value=newVal;console.log("props.modelValue",props.modelValue);emits('update:modelValue',newVal)
})</script><style lang='scss' scoped></style>

到这基本上就可以实现了。这一版的特点就是弹窗的关闭时其实本身没有销毁。我们是通过双向绑定跟新了弹窗的状态

但是我们考虑一个场景,就是表单弹窗复用。新增和编辑态我们要做区分。这时候我们手动传属性标识是编辑还是新增就很麻烦。有一个简单的办法就是我们在关闭弹窗时直接把它销毁,这样每次我们只需要在生命周期的onMounted中判断是否有id传过来就可以了。如果有id则说明是编辑态。否则是新增的场景。这样就很容易区分。我们改造下代码:

改进版

销毁弹窗我们通过v-if来控制

父组件<button @click="openDialog" >打开dialoag</button><Dialog  v-if="show" v-model="show"/>
//注意这里增加了v-if
弹窗组件
<template><el-dialogv-model="visible"title="Tips"width="30%"@close="handerClose"><P>This is a message</P><P>This is a message</P><P>This is a message</P><P>This is a message</P><P>This is a message</P><P>This is a message</P><P>This is a message</P><el-button @click="cancel">取消</el-button><el-button @click="confirm">确定</el-button></el-dialog>
</template><script setup lang='ts'>import { ref, reactive, watch, onMounted, onUnmounted } from 'vue'const emits=defineEmits(['close','confirm','update:modelValue'])const props=defineProps({modelValue:{type:Boolean,default:false}
})
const visible=ref(props.modelValue)const cancel=()=>{emits('update:modelValue',false)
}
const confirm=()=>{emits('update:modelValue',false)
}const handerClose=()=>{console.log("点击关闭按钮");emits('update:modelValue',false)
}onMounted(()=>{console.log("挂载");
})onUnmounted(()=>{console.log("卸载");
})
watch(()=>props.modelValue,(newVal)=>{visible.value=newVal;console.log("props.modelValue",props.modelValue);emits('update:modelValue',newVal)
})</script><style lang='scss' scoped></style>

在组件内部,我们通过定义visible,初始状态和props.modelValue绑定,后续跟新在watch里同步,这样就可以实现每次销毁和挂载

注意:

const visible=ref(props.modalValue),定义visible的时候一定要先和props.modalValue进行绑定。不然父组件点击不会弹出来


http://www.ppmy.cn/server/145645.html

相关文章

git merge 排除文件

方法一&#xff1a; 在Git中&#xff0c;如果你想在合并时排除特定文件&#xff0c;你可以使用.gitattributes文件来指定合并策略。你可以设置一个自定义合并策略来忽略特定文件的合并。 首先&#xff0c;在仓库的根目录下创建或编辑.gitattributes文件&#xff0c;并添加以…

微服务上下线动态感知实现的技术解析

序言 随着微服务架构的广泛应用&#xff0c;服务的动态管理和监控变得尤为重要。在微服务架构中&#xff0c;服务的上下线是一个常见的操作&#xff0c;如何实时感知这些变化&#xff0c;确保系统的稳定性和可靠性&#xff0c;成为了一个关键技术挑战。本文将深入探讨微服务上…

【C++】string类练习

test1:反转字母 给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&#xff1a; 输入&#xff1a;s "ab-cd" 输出&#xff1a;…

后端并发编程操作简述 Java高并发程序设计 六类并发容器 七种线程池 四种阻塞队列

目录 并发集合 1. ConcurrentHashMap&#xff1a; 2. CopyOnWriteArrayList&#xff1a; 3. CopyOnWriteArraySet&#xff1a; 4. BlockingQueue系列&#xff1a; 5. ConcurrentSkipListMap 和 ConcurrentSkipListSet&#xff1a; 6. ConcurrentLinkedDeque&#xff1a;…

LSA详情与特殊区域

LSA是构成LSDB的重要原材料&#xff0c;在OSPF中发挥很大作用。 报文 通用头部 LS age&#xff1a;LSA寿命&#xff0c;0-3600s Options&#xff1a;可选项 LS type&#xff1a;LSA类型&#xff0c;三要素之一 Link State ID&#xff1a;LSAID 三要素之一 Advertising Ro…

25.100ASK_T113-PRO 测试摄像头(型号)

1.摄像头 USB2.0 摄像头,支持 UVC协议, 就是V4L2 USB2.0 大概可这样理解吧.这个是2K分辨率. 2.8mm焦距. 开发板还是 100ASK_T113-PRO V1.2版 2.查看摄像头驱动挂载情况 这样接好. 看看设备有没有挂载上 # ls /dev/video* /dev/video0 /dev/video1 这两个就是USB摄像头.说…

Dart 中 initializer lists

在 Dart 中&#xff0c;initializer lists 是构造函数的一种特性&#xff0c;允许你在进入构造函数体之前对某些字段进行初始化或进行检查。这些字段包括 final 字段&#xff0c;因为 final 字段必须在构造函数体运行之前被初始化。 以下是它的几个关键点和适用场景&#xff1…

Redis(4):主从复制

一、主从复制概述 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。   默认情况下&#xff0c;每台Redis…