当前位置:首页 > VUE

vue自己实现dialog

2026-01-18 12:49:14VUE

实现自定义 Dialog 组件

封装基础 Dialog 组件 创建 Dialog.vue 文件,使用 v-model 控制显示状态,通过插槽支持内容自定义:

<template>
  <div class="dialog-mask" v-if="visible" @click.self="close">
    <div class="dialog-container">
      <div class="dialog-header">
        <slot name="header">{{ title }}</slot>
        <button @click="close">×</button>
      </div>
      <div class="dialog-body">
        <slot></slot>
      </div>
      <div class="dialog-footer">
        <slot name="footer">
          <button @click="close">取消</button>
          <button @click="$emit('confirm')">确定</button>
        </slot>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    visible: Boolean,
    title: String
  },
  methods: {
    close() {
      this.$emit('update:visible', false)
    }
  }
}
</script>

<style scoped>
.dialog-mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0,0,0,0.5);
  display: flex;
  justify-content: center;
  align-items: center;
}
.dialog-container {
  background: white;
  min-width: 300px;
  border-radius: 4px;
  overflow: hidden;
}
.dialog-header {
  padding: 16px;
  display: flex;
  justify-content: space-between;
  border-bottom: 1px solid #eee;
}
.dialog-body {
  padding: 24px 16px;
}
.dialog-footer {
  padding: 12px 16px;
  text-align: right;
  border-top: 1px solid #eee;
}
</style>

通过服务式调用 创建 dialog.js 服务文件实现动态调用:

import Vue from 'vue'

const DialogConstructor = Vue.extend(require('./Dialog.vue'))

function showDialog(options) {
  const instance = new DialogConstructor({
    propsData: options.props
  })

  if (options.parent) {
    instance.$mount(options.parent.appendChild(document.createElement('div')))
  } else {
    document.body.appendChild(instance.$mount().$el)
  }

  return {
    close: () => {
      instance.visible = false
      setTimeout(() => {
        instance.$destroy()
        instance.$el.remove()
      }, 300)
    }
  }
}

export default {
  install(Vue) {
    Vue.prototype.$dialog = showDialog
  }
}

全局注册使用main.js 中安装插件:

vue自己实现dialog

import Dialog from './plugins/dialog'
Vue.use(Dialog)

组件调用示例

<template>
  <button @click="show">打开弹窗</button>
</template>

<script>
export default {
  methods: {
    show() {
      this.$dialog({
        props: {
          visible: true,
          title: '提示'
        }
      })
    }
  }
}
</script>

模板调用示例

vue自己实现dialog

<Dialog v-model="visible" title="自定义标题">
  <template #header>替换标题</template>
  主体内容
  <template #footer>
    <button @click="visible = false">关闭</button>
  </template>
</Dialog>

动画效果增强 添加过渡动画需修改样式:

.dialog-mask {
  /* 原有样式 */
  opacity: 0;
  transition: opacity 0.3s;
}
.dialog-mask.v-enter-active, 
.dialog-mask.v-leave-active {
  opacity: 1;
}
.dialog-container {
  transform: translateY(-20px);
  transition: transform 0.3s;
}
.dialog-mask.v-enter-active .dialog-container,
.dialog-mask.v-leave-active .dialog-container {
  transform: translateY(0);
}

注意事项

  • 通过 z-index 控制层级关系
  • 防止背景滚动需添加 overflow: hiddenbody
  • 服务式调用需手动管理组件销毁
  • 可通过 provide/inject 实现深层嵌套内容控制

标签: vuedialog
分享给朋友:

相关文章

vue怎么实现文件树

vue怎么实现文件树

Vue 实现文件树的方法 使用递归组件 递归组件是处理嵌套数据结构的理想方式。文件树通常包含文件夹和文件的嵌套结构,适合用递归组件实现。 <template> <ul>…

vue动画实现

vue动画实现

Vue动画实现方法 Vue提供了多种方式实现动画效果,主要通过内置组件和第三方库完成。 使用<transition>组件 Vue内置的<transition>组件可以为元素添…

vue实现快手

vue实现快手

Vue 实现类似快手的功能 Vue.js 是一个渐进式 JavaScript 框架,适合构建复杂的单页应用。要实现类似快手的功能,可以结合 Vue 和相关技术栈进行开发。 核心功能模块 视频流展示…

vue实现vmodel

vue实现vmodel

Vue 实现 v-model Vue 的 v-model 是一个语法糖,用于在表单元素或组件上实现双向数据绑定。以下是其实现方式和原理的详细说明。 在表单元素上使用 v-model v-model…

vue实现cs程序

vue实现cs程序

Vue 实现 CS(客户端-服务器)程序 Vue 本身是一个前端框架,主要用于构建用户界面。要实现一个完整的 CS(客户端-服务器)程序,需要结合后端技术。以下是实现的基本思路和步骤: 前端部分(V…

vue嵌套grafana实现

vue嵌套grafana实现

Vue 中嵌套 Grafana 的实现方法 使用 iframe 嵌入 Grafana 面板 在 Vue 项目中可以通过 iframe 直接嵌入 Grafana 的面板或仪表板。确保 Grafana 已…