方法一: 给外层容器定义一个阻止冒泡事件 @click.stop
,则该容器内的点击不会传递到外层容器,所以全局监听不到该点击事件,在该容器内部点击不会触发点击函数。当弹框出现时,点击外部空白区域,弹框关闭。
方法二: 给外层容器设置一个 ref="mian"
,当 visible为 true时,弹框出现。在该容器外点击 this.$refs.main.$el.contains(e.target)
为 false,在容器内点击则为 true。
两种方法都需要组件挂载完毕,全局添加一个点击事件,组件注销前,将点击事件移除。
<template> <view @click.stop ref="main"> <view @click.stop="handleOpenPopup">按钮</view> <view v-if="visible">弹出的内容</view> </view> </template>
<script> export default { data() { return { visible: false, } }, mounted() { document.addEventListener('click', this.handleClose); }, beforeDestroy() { document.removeEventListener('click', this.handleClose); }, methods: { handleOpen() { if (!this.visible) this.visible = true; }, handleClose(e) { if (this.visible) this.visible = false; if (!this.$refs.main.$el.contains(e.target) && this.visible) this.visible = false; } } } </script>
|