Vue 实现点击空白处关闭组件

923 阅读1分钟

场景

点击空白处时关闭某个打开的组件,比如一个dialog,再比如下拉框。 当然,使用elementui就可以简单的完成这个需求,但是,项目中总有一些“合理”的需求,让我们只能东拼西凑的去使用elementui中的组件。

for example,我写下这篇记录的原因就是:我接到的需求elementuiselect组件不能直接实现,所以我使用elementuiinput组件和select组件的下拉框也就是option部分整合成了一个组件。脱离了selectoption自然是不能点击空白处实现关闭的。

那怎么办,总不能让他一直打开着吧,那就只能手动实现咯。。。

实现

  1. 显示组件时设置监听点击函数

    open() {
        document.addEventListener('click', this.close, false)
        this.visible = true;
    },
    
  2. 关闭组件函数

    close(e) {
        //判断点击的事件源不是从显示的组件内部触发的也不是从input触发的
        if (e.target.className !== 'el-select-dropdown__item' && !this.$refs.advanceInput.contains(e.target)) {
            this.visible = false
            this.removeListener()
        }
    },
    
  3. 移除监听函数

    removeListener() {
        document.removeEventListener('click', this.close, false)
    },
    

补充: 针对“判断点击的事件源不是从显示的组件内部触发的也不是从input触发的”,这个其实不用判断的那么复杂,只需要禁止点击事件冒泡即可,禁止冒泡之后就不会冒泡到document,自然也不会被document的click事件监听到