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

Posted 林恒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录--vue3优雅的使用element-plus的dialog相关的知识,希望对你有一定的参考价值。

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

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

优点

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

想法

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

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

效果图

 

基于 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"
      :
      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

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

 

Vue3 使用 element-plus 不生效

createApp(App)指的是一个app

这样是不会生效的

 这样才是一个app

 

 

 

以上是关于记录--vue3优雅的使用element-plus的dialog的主要内容,如果未能解决你的问题,请参考以下文章

Vue3中element-plus全局使用Icon图标

Vue3 使用 element-plus 不生效

Vue3 Element-Plus pagination组件基本使用

Vue 3 日期选择器 Element-Plus

解决vue3+vite+TS 中使用element-plus按需引入 ElLoadingElMessage 样式失效

vue3.x结合element-plus如何使用icon图标