当前位置:首页 > VUE

vue 实现弹窗组件

2026-01-16 21:57:52VUE

Vue 弹窗组件实现

基础弹窗组件结构

创建一个名为Modal.vue的文件,定义弹窗的基础结构和样式:

<template>
  <div class="modal-mask" v-show="visible" @click.self="close">
    <div class="modal-container">
      <div class="modal-header">
        <h3>{{ title }}</h3>
        <button @click="close">&times;</button>
      </div>
      <div class="modal-body">
        <slot></slot>
      </div>
      <div class="modal-footer">
        <button @click="close">取消</button>
        <button @click="confirm">确定</button>
      </div>
    </div>
  </div>
</template>

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

<style scoped>
.modal-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;
}
.modal-container {
  background: white;
  min-width: 300px;
  border-radius: 4px;
  overflow: hidden;
}
.modal-header {
  padding: 16px;
  display: flex;
  justify-content: space-between;
  border-bottom: 1px solid #eee;
}
.modal-body {
  padding: 16px;
}
.modal-footer {
  padding: 16px;
  text-align: right;
  border-top: 1px solid #eee;
}
</style>

使用弹窗组件

在父组件中注册并使用弹窗:

<template>
  <div>
    <button @click="showModal = true">打开弹窗</button>
    <Modal 
      v-model:visible="showModal"
      title="提示"
      @confirm="handleConfirm"
    >
      <p>这是弹窗内容</p>
    </Modal>
  </div>
</template>

<script>
import Modal from './Modal.vue'

export default {
  components: { Modal },
  data() {
    return {
      showModal: false
    }
  },
  methods: {
    handleConfirm() {
      console.log('用户点击了确定')
    }
  }
}
</script>

进阶功能实现

动态控制弹窗宽度 在Modal组件中添加width属性:

<script>
export default {
  props: {
    width: {
      type: String,
      default: 'auto'
    }
  }
}
</script>

<style scoped>
.modal-container {
  width: v-bind(width);
}
</style>

添加动画效果 使用Vue的transition组件实现淡入淡出效果:

<template>
  <transition name="fade">
    <div class="modal-mask" v-show="visible" @click.self="close">
      <!-- 其余内容不变 -->
    </div>
  </transition>
</template>

<style scoped>
.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.3s;
}
.fade-enter-from,
.fade-leave-to {
  opacity: 0;
}
</style>

全局弹窗服务 创建全局弹窗服务避免重复导入:

// modalService.js
import { createApp } from 'vue'
import Modal from './Modal.vue'

export default {
  install(app) {
    const modalInstance = createApp(Modal).mount(document.createElement('div'))
    document.body.appendChild(modalInstance.$el)

    app.config.globalProperties.$modal = {
      show(options) {
        Object.assign(modalInstance, options)
        modalInstance.visible = true
        return new Promise(resolve => {
          modalInstance.$once('confirm', () => resolve(true))
          modalInstance.$once('update:visible', val => !val && resolve(false))
        })
      }
    }
  }
}

在main.js中注册:

import modalService from './modalService.js'
const app = createApp(App)
app.use(modalService)

使用全局弹窗:

this.$modal.show({
  title: '全局弹窗',
  content: '这是全局弹窗内容'
}).then(confirmed => {
  console.log(confirmed ? '用户确认' : '用户取消')
})

vue 实现弹窗组件

标签: 组件vue
分享给朋友:

相关文章

vue实现预约页面

vue实现预约页面

Vue 预约页面实现步骤 准备工作 安装Vue CLI创建项目,确保已配置好开发环境。使用vue create appointment-page初始化项目,选择默认配置或手动配置。 页面结构设计…

vue实现静态查询

vue实现静态查询

Vue 实现静态查询 在 Vue 中实现静态查询通常指不依赖后端接口,直接在前端处理数据筛选或搜索功能。以下是几种常见实现方式: 使用计算属性过滤数据 通过计算属性对静态数据进行筛选,适合简单查询场…

vue实现选择分类

vue实现选择分类

Vue 实现选择分类的方法 使用 v-model 绑定选择值 在 Vue 中可以通过 v-model 指令实现双向数据绑定,适用于下拉选择框(<select>)。以下是一个基本示例: &…

vue实现图片搜索

vue实现图片搜索

Vue实现图片搜索功能 使用HTML5的File API获取图片 通过<input type="file">元素让用户选择图片文件,使用FileReader对象读取图片数据。 <…

vue实现下拉层级

vue实现下拉层级

Vue实现下拉层级菜单 使用Vue实现下拉层级菜单可以通过递归组件或动态渲染的方式完成。以下是两种常见实现方法: 递归组件实现 创建一个递归组件处理多级菜单结构: <template>…

vue实现一个系统

vue实现一个系统

Vue 系统实现步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目: npm init vue@latest my-system 选择需要的配置(Router、Pinia 等)。…