首页 > 其他分享 >记录--vue3优雅的使用element-plus的dialog

记录--vue3优雅的使用element-plus的dialog

时间:2023-05-17 17:56:12浏览次数:47  
标签:index const -- element plus dialog import addDialog 弹窗

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

如何优雅的基于 element-plus,封装一个梦中情 dialog

优点

摆脱繁琐的 visible 的命名,以及反复的重复 dom。

想法

将 dialog 封装成一个函数就能唤起的组件。如下:

addDialog({
  title: "测试", //弹窗名
  component: TestVue, //组件
  width: "400px", //弹窗大小
  props: {
    //传给组件的参数
    id: 0
  },
  callBack: (data: any) => {
    //当弹窗任务结束后,调用父页面的回掉函数。(比如我新增完成了需要刷新列表页面)
    console.log("回调函数", data)
  }
})

效果图

 

dialog.gif

基于 el-dialog 进行初步封装

// index.ts
import { reactive } from "vue"
type dialogOptions = {
  title: string
  component: any
  props?: Object
  width: string
  visible?: any
  callBack?: Function
}
export const dialogList: dialogOptions[] = reactive([])

export const addDialog = (options: dialogOptions) => {
  dialogList.push(Object.assign(options, { visible: true }))
}

export const closeDialog = (item: dialogOptions, i: number, args?: any, isNativeClose?: boolean) => {
  dialogList.splice(i, 1)
  if (!isNativeClose) item.callBack && item.callBack(...args)
}
<template>
  <Teleport to="body">
    <el-dialog
      v-for="(item, index) in dialogList"
      :key="index"
      :title="item.title"
      :width="item.width"
      v-model="item.visible"
      @close="() => closeDialog(item, index, '', true)"
    >
      <component :is="item.component" v-bind="item.props" @close="(...args:any) => closeDialog(item, index, args)" />
    </el-dialog>
  </Teleport>
</template>

<script setup lang="ts">
  import { dialogList, closeDialog } from "./index"
</script>
  • 首先定义了 dialogList,它包含了所有弹窗的信息。
  • component 使用 componet is 去动态加载子组件
  • addDialog 调用唤起弹窗的函数
  • closeDialog 关闭弹窗的函数

在app.vue中挂载

<script setup>
import Mydialog from "@/components/gDialog/index.vue"
</script>

<template>
 <router-view />
 <Mydialog></Mydialog>
</template>

<style scoped>

</style>

使用

创建一个弹窗组件

<!-- test.vue -->
<template>
  父弹窗
  <el-button type="primary" @click="openChildDialog">打开子dialog</el-button>
  <el-button type="primary" @click="closeDialog">关闭弹窗</el-button>
</template>

<script setup lang="ts">
  import { addDialog } from "@/components/gDialog/index"
  import childVue from "./child.vue"
  const props = defineProps(["id"])
  console.log(props.id, "props")
  const emit = defineEmits(["close"])
  const closeDialog = () => {
    emit("close", 1, 2, 34)
  }
  const openChildDialog = () => {
    addDialog({
      title: "我是子dialog",
      width: "500px",
      component: childVue
    })
  }
</script>

在列表页面唤醒弹窗

<!-- list.vue -->
<template>
  列表页
  <el-button type="primary" @click="openDialog">打开dialog</el-button>
</template>
<script setup lang="ts">
import { addDialog } from "@/components/gDialog/index"
import TestDialog from "./test.vue"
const openDialog = () => {
  addDialog({
    title: "我是dialog",
    width: "500px",
    props:{
      id:0
    }
    component: TestDialog,
    callBack: (data: any) => {
      //当弹窗任务结束后,调用父页面的回掉函数。(比如我新增完成了需要刷新列表页面)
      console.log("回调函数", data)
    }
  })
}

多层级弹窗嵌套

<!-- child.vue -->
<template>
  子弹窗
  <el-button type="primary" @click="closeDialog">关闭弹窗</el-button>
</template>

<script setup lang="ts">
  import { addDialog } from "@/components/gDialog/index"
  const emit = defineEmits(["close"])
  const closeDialog = () => {
    emit("close", 1, 2, 34)
  }
</script>

附上代码

代码

本文转载于:

https://juejin.cn/post/7224007334514638903

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:index,const,--,element,plus,dialog,import,addDialog,弹窗
From: https://www.cnblogs.com/smileZAZ/p/17409550.html

相关文章

  • 大模型知识点
    参数有效化微调(ParameterEfficientFineTuning,PEFT)参数有效化微调大致可以分为三个方法:Adapter、Prompt、LoRA LORA:LoRA的思想也很简单,在自注意力层的四个权重矩阵Wq,Wk,Wv,Wo的所有或者部分旁边增加一个旁路(如文中表示在GPT3上只有Wq和Wv加了旁路),做一个降维再升维的操......
  • 考虑柔性负荷的综合能源低碳经济调度 调度模型参考第
    考虑柔性负荷的综合能源低碳经济调度调度模型参考第一篇文献碳交易模型参考第二篇考虑三种场景并用cplex求解场景一调度结果如图所示本代码可改写能力强ID:49150696224502280......
  • 基于储能电站服务的冷热微网系统双层优化 建立考虑不同时间尺
    基于储能电站服务的冷热微网系统双层优化建立考虑不同时间尺度问题的双层规划模型上层负责求解长时间尺度的储能配置问题下层求解短时间尺度的微网优化运行问题才用KKT条件将双层转化为单层又采用大M法将模型线性化处理最后用cplex/gurobi求解器进行求解ID:94150696225026353......
  • 三菱Q型pLc.QD75Mh4定位及控制.4轴伺服定位及控制,触摸屏及plc程序,三菱伺服,光纤伺服通
    三菱Q型pLc.QD75Mh4定位及控制.4轴伺服定位及控制,触摸屏及plc程序,三菱伺服,光纤伺服通讯,参考性强,已安全应用,4轴机械手抓拿焊接线,技术性资料ID:3450628593504077......
  • 判断一个数的平方根是否为整数
    #include<bits/stdc++.h>usingnamespacestd;boola_test(intx){ //如果大数,int->longlong if(sqrt(x)==(int)sqrt(x)){ returntrue; }else{ returnfalse; }}intmain(){ cout<<a_test(10)<<endl;//0 cout<......
  • linux-安装系统Ubuntu Server 14.04,16.04和17.10
    安装系统UbuntuServer14.04,16.04和17.10 本文以14.04位案例进行安装,其他版本相关问题会做注解1.选择要安装的系统语言本界面建议选择English,之后再选择中文安装对于14.x版本选择中文没有问题,但是对于16.04和17.10版本,该步骤选择中文后面会报错:2.选择安装过程中需要的语......
  • excel-08-Excel函数由浅入深-Excel函数
    Excel函数填充定义:是Excel中的内置函数,使用时,不区分大小写且每个函数都有其特定的功能和用途结构:以“=”为引导,函数名称开始,后接左括号,然后以逗号分隔输入的参数,最后是右括号。分类:共包含11类,分别是数据库函数,日期与时间函数、工程函数、财务函数、信息函数、逻辑函数、查询......
  • 音频格式及转换代码
    音频信号的读写、播放及录音python已经支持WAV格式的书写,而实时的声音输入输出需要安装pyAudio(http://people.csail.mit.edu/hubert/pyaudio)。最后我们还将使用pyMedia(http://pymedia.org)进行Mp3的解码和播放。音频信号是模拟信号,我们需要将其保存为数字信号,才能对语音进行......
  • 单相全桥PWM整流双闭环控制。 电压环采用PI控制器,电流环
    单相全桥PWM整流双闭环控制。电压环采用PI控制器,电流环采用PR控制器;可以实现整流器交流侧单位功率因数,直流侧电压恒定。额定:交流侧电压60V,电流10A,直流侧电压150V。图为电阻1秒突加时的波形图,验证了闭环控制系统的稳定性!ID:2550671723817786......
  • 线段树维护矩阵
    对于一些只有单点修改且维护的信息具有递推性的题目,由于运算具有结合律,可以将两区间合并写成矩阵乘法的形式,省去一些麻烦的讨论。前置知识:广义矩阵乘法对于一个\(n\timesm\)的矩阵\(A\)和一个\(m\timest\)的矩阵\(B\),定义广义矩阵乘法:\[C_{i,j}=\bigoplus_{k=1}^{m}A_......