如何通过Vue3+Element Plus自定义弹出框组件

 更新时间:2024年05月11日 10:24:31   作者:摆脱小白  
这篇文章主要给大家介绍了关于如何通过Vue3+Element Plus自定义弹出框组件的相关资料,弹窗是前端开发中的一种常见需求,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言

在Vue 3项目中,使用Element Plus构建弹出框是一项常见的任务。为了简化这个过程,我们可以封装一个公共组件,使弹出框的调用变得简单而高效。本文将介绍如何通过Vue 3和Element Plus,使用一个自定义的弹出框组件实现这一目标。

1. 弹出框组件封装

首先,我们封装了一个通用的弹出框组件,具体实现位于 util.js 文件中。通过 initInstance 方法,我们可以动态创建一个弹出框实例,并将其挂载到指定的容器上。以下是简要代码:

// util.js

import { h, render } from 'vue';

export function initInstance(component, container, option) {
    const vNode = h(component, option);
    render(vNode, container);
    document.body.appendChild(container.firstElementChild);
    return vNode.component;
}

export function getContainer() {
    return document.createElement('div');
}

2. 自定义弹出框配置

接下来,我们定义了一个名为 portPop 的自定义弹出框配置。这个配置使用了前面封装的通用方法,同时为弹出框提供了一些特定的配置。以下是简要代码:

// common.js

import { initInstance, getContainer } from "./util";
import PortPop from "../components/PortPop";

const instanceMap = new Map();

export const portPop = (option, call) => {
    const container = getContainer();
    let opt = {
        ...option,
        onComfrim: (data) => {
            call(data);
        },
        onVanish: () => {
            render(null, container);
            instanceMap.delete(vm);
        },
    };
    const component = initInstance(PortPop, container, opt);
    const vm = component.proxy;
    component.exposed.openDialog();
    instanceMap.set(vm, { option: opt });
};

3. 弹出框组件实现

首先,我们要先封装一下el-dialog组件 

<template>
  <el-dialog
    :model-value="modelValue"
    :title="title"
    :width="width"
    :modal="modal"
    draggable
    destroy-on-close
    :close-on-click-modal="false"
    append-to-body
    :before-close="beforeClose"
    @close="dialogColse"
    @closed="dialogColsed"
  >
    <slot />
    <template #footer>
      <span class="dialog-footer">
        <slot name="footer" />
      </span>
    </template>
  </el-dialog>
</template>
<script setup name="Dialog">
import { ElDialog } from "element-plus";
const props = defineProps({
  modelValue: {
    type: [Boolean],
    default: false,
  },
  title: {
    type: [String],
    default: "",
  },
  width: {
    type: [String],
    default: "",
  },
  modal: {
    type: [Boolean],
    default: false,
  },
  beforeClose: [Function],
});
const emits = defineEmits(["update:modelValue", "onClosed", "closed"]);
function dialogColse() {
  emits("update:modelValue", false);
}
function dialogColsed() {
  emits("onClosed", false);
  emits("closed", false);
}
</script>

<style lang="scss">
</style>

最后,我们实现了具体的弹出框组件 PortPop,这个组件使用了 Element Plus 的 Dialog 组件,并在其中嵌套了一些其他组件,以实现特定的功能。以下是简要代码:

<template>
  <div>
    <Dialog :title="props.title" v-model="dialog" width="920px">
        <!-- ... 弹出框内容 ... -->
        <template #footer>
            <div class="dialog-footer">
              <el-button type="primary" size="small" @click="confrim">
                确定
              </el-button>
              <el-button @click="dialog = false" size="small">取消</el-button>
            </div>
          </template>
    </Dialog>
  </div>
</template>

<script setup lang="tsx">
import {
  nextTick,
  ref, useAttrs,
} from 'vue'
import Dialog from '@/components/dialog'
import {
  ElInput,
  ElButton,
} from 'element-plus'

const props = defineProps({
  title: {
    type: [String],
    default: '',
  },
  type: {
    type: [String],
    default: '',
  },
})

const emits = defineEmits(['comfrim'])
const attrs = useAttrs()
const dialog = ref(false)
function openDialog() {
  dialog.value = true
}
const confrim = async () => {
  emits('comfrim', "传递给父组件的数据")
  nextTick(() => {
    dialog.value = false
  })
}
defineExpose({ openDialog })

</script>
<style lang="scss">
</style>

4. 使用自定义弹出框组件

最终,我们可以在需要调用弹出框的地方,简单地执行portPop方法,并传递相应的配置和回调函数。这样,弹出框就会显示出来,用户可以与之交互。

// 在需要的地方调用自定义弹出框
import { portPop } from "./customDialog";

// 示例调用
portPop({ title: '自定义弹出框', defaultKeyword: '关键字' }, (data) => {
    // 处理弹出框确认后的数据
    console.log('用户选择的数据:', data);
});

文件结构示例

组定义组件文件示例

效果:

总结 

到此这篇关于如何通过Vue3+Element Plus自定义弹出框组件的文章就介绍到这了,更多相关Vue3 ElementPlus自定义弹出框组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue.js数据加载完成前显示原代码{{代码}}问题及解决

    vue.js数据加载完成前显示原代码{{代码}}问题及解决

    这篇文章主要介绍了vue.js数据加载完成前显示原代码{{代码}}问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • webpack搭建vue环境时报错异常解决

    webpack搭建vue环境时报错异常解决

    这篇文章主要介绍了webpack搭建vue环境时报错异常解决,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • vue封装form表单组件拒绝重复写form表单

    vue封装form表单组件拒绝重复写form表单

    这篇文章主要为大家介绍了vue封装form表单组件拒绝重复写form表单的实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • vue中实现点击空白区域关闭弹窗的两种方法

    vue中实现点击空白区域关闭弹窗的两种方法

    这篇文章主要介绍了vue中实现点击空白区域关闭弹窗的两种方法,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2020-12-12
  • vue打包添加gzip配置项方式

    vue打包添加gzip配置项方式

    这篇文章主要介绍了vue打包添加gzip配置项方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Vue初始化中的选项合并之initInternalComponent详解

    Vue初始化中的选项合并之initInternalComponent详解

    这篇文章主要介绍了Vue初始化中的选项合并之initInternalComponent的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • mint-ui在vue中的使用示例

    mint-ui在vue中的使用示例

    Mint UI 是 由饿了么前端团队推出的 一个基于 Vue.js 的移动端组件库,这篇文章主要介绍了mint-ui在vue中的使用示例,这里整理了详细的代码,有需要的小伙伴可以参考下
    2018-04-04
  • vue element-ui中table合计指定列求和实例

    vue element-ui中table合计指定列求和实例

    这篇文章主要介绍了vue element-ui中table合计指定列求和实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 第一次接触神奇的前端框架vue.js

    第一次接触神奇的前端框架vue.js

    第一次接触神奇的vue.js,主要了解一下v-model、v-if、v-else、v-show、v-for等,感兴趣的小伙伴们可以一起学习一下
    2016-12-12
  • vue中多附件上传的实现示例

    vue中多附件上传的实现示例

    这篇文章主要介绍了vue中多附件上传的实现示例,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
    2021-04-04

最新评论