<template>
<div id="app">
<button @click="showModal = true">打开弹窗</button>
<div v-if="showModal" class="modal">
<div class="modal-content">
<span class="close" @click="showModal = false">×</span>
<p>这里是弹窗内容</p>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
showModal: false
};
},
mounted() {
document.addEventListener('click', this.handleClickOutside);
},
beforeDestroy() {
document.removeEventListener('click', this.handleClickOutside);
},
methods: {
handleClickOutside(event) {
if (!this.$el.contains(event.target)) {
this.showModal = false;
}
}
}
};
</script>
<style>
.modal {
position: fixed;
top: 50px;
left: 50px;
z-index: 1000;
background-color: #fff;
border: 1px solid #999;
padding: 20px;
}
.modal-content {
position: relative;
}
.close {
position: absolute;
top: 10px;
right: 10px;
font-size: 28px;
cursor: pointer;
}
</style>
在这个示例中,我们有一个按钮来打开弹窗,弹窗内有一个关闭按钮和文本内容。通过监听document
上的点击事件,我们可以在handleClickOutside
方法中判断点击事件是否发生在弹窗外部,如果是,则关闭弹窗。在组件被销毁前,我们还需要移除事件监听器,以防止内存泄漏。