AdiHuang's notes

vue-dropdown.md

vue实现点击空白关闭弹窗,模拟下拉框Dropdown

方法一: 给外层容器定义一个阻止冒泡事件 @click.stop ,则该容器内的点击不会传递到外层容器,所以全局监听不到该点击事件,在该容器内部点击不会触发点击函数。当弹框出现时,点击外部空白区域,弹框关闭。 方法二: 给外层容器设置一个 ref="mian" ,当 visibl

方法一: 给外层容器定义一个阻止冒泡事件 @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>