当前位置:首页 > 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 中安装插件:

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>

模板调用示例

<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 实现深层嵌套内容控制

vue自己实现dialog

标签: vuedialog
分享给朋友:

相关文章

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单的常见方法 基于路由配置生成菜单 Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统: // router/index.js const route…

vue页面分离的实现

vue页面分离的实现

Vue页面分离的实现方法 将Vue页面分离为多个组件或模块,有助于提升代码可维护性和复用性。以下是几种常见的实现方式: 组件化拆分 通过将页面拆分为多个子组件,每个组件负责特定功能或UI部分。使用i…

vue路由实现内部切换

vue路由实现内部切换

Vue 路由实现内部切换的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页应用(SPA)的页面切换。以下是几种常见的内部路由切换方式: 使用 <router-lin…

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。…

vue实现星星

vue实现星星

实现星星评分的Vue组件 使用Vue实现星星评分功能可以通过组件化方式完成,以下是一个完整的实现方案: 模板部分 <template> <div class="star-…

vue实现轮询

vue实现轮询

实现轮询的基本方法 在Vue中实现轮询可以通过setInterval或setTimeout配合递归调用完成。轮询通常用于定期向服务器请求数据更新。 使用setInterval的简单示例: data…