vue实现弹窗代码
Vue 弹窗实现方法
方法一:使用组件与v-if控制显示
创建一个独立的弹窗组件(如Modal.vue),通过父组件的v-if或v-show控制显隐:
<!-- Modal.vue -->
<template>
<div class="modal-mask" v-if="visible">
<div class="modal-container">
<slot></slot>
<button @click="$emit('close')">关闭</button>
</div>
</div>
</template>
<script>
export default {
props: ['visible']
}
</script>
<style>
.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;
padding: 20px;
border-radius: 5px;
}
</style>
父组件调用方式:
<template>
<button @click="showModal = true">打开弹窗</button>
<Modal :visible="showModal" @close="showModal = false">
<h3>弹窗内容</h3>
</Modal>
</template>
<script>
import Modal from './Modal.vue'
export default {
components: { Modal },
data() {
return { showModal: false }
}
}
</script>
方法二:使用Vue插件形式
创建可编程式调用的弹窗插件:
// modalPlugin.js
const ModalPlugin = {
install(Vue) {
Vue.prototype.$modal = {
show(options) {
const ComponentClass = Vue.extend(ModalComponent)
const instance = new ComponentClass({ propsData: options })
instance.$mount()
document.body.appendChild(instance.$el)
return instance
}
}
}
}
const ModalComponent = {
template: `
<div class="modal-mask">
<div class="modal-container">
<h3>{{ title }}</h3>
<p>{{ content }}</p>
<button @click="$emit('close')">关闭</button>
</div>
</div>
`,
props: ['title', 'content']
}
export default ModalPlugin
在main.js中注册:
import ModalPlugin from './modalPlugin'
Vue.use(ModalPlugin)
组件内调用:
this.$modal.show({
title: '提示',
content: '操作成功'
})
方法三:使用第三方库
安装流行弹窗库如vue-js-modal:
npm install vue-js-modal
全局注册:
import VModal from 'vue-js-modal'
Vue.use(VModal)
组件内使用:
<template>
<button @click="showModal = true">打开</button>
<modal v-model="showModal" name="example">
<p>弹窗内容</p>
</modal>
</template>
<script>
export default {
data() {
return { showModal: false }
}
}
</script>
弹窗最佳实践
- 添加过渡动画增强用户体验
<transition name="fade"> <Modal v-if="showModal" /> </transition>
-
实现点击遮罩层关闭
<div class="modal-mask" @click.self="$emit('close')"> <div class="modal-container">...</div> </div> -
禁止背景滚动
watch: { showModal(val) { document.body.style.overflow = val ? 'hidden' : '' } }







