当前位置:首页 > 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 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue实现付款

vue实现付款

Vue 实现付款功能 在 Vue 中实现付款功能通常需要集成第三方支付网关(如支付宝、微信支付、Stripe 等)。以下是常见的实现方法: 集成支付宝/微信支付 安装必要的依赖(如 axios 用…

vue 实现复选

vue 实现复选

Vue 实现复选功能 在 Vue 中实现复选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集用户选择的复选框值。…

vue实现旋转

vue实现旋转

Vue 实现旋转效果的方法 在 Vue 中实现旋转效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 动画 通过 Vue 的 :class 或 :style 绑定 CSS 动画实现旋转效…

vue实现贴图

vue实现贴图

Vue 实现贴图功能 在Vue中实现贴图功能通常涉及将图片动态添加到指定位置或元素上。以下是几种常见实现方式: 使用v-bind动态绑定图片 通过数据驱动的方式动态更换图片源: <tem…

vue 实现jqslidedown

vue 实现jqslidedown

在 Vue 中实现类似 jQuery 的 slideDown 效果,可以通过 Vue 的过渡系统或 CSS 动画结合动态样式绑定来实现。以下是几种实现方式: 使用 Vue Transition…