Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
在项目中往往会有这样的需求:弹出框(或Popover)在show后,点击空白处可以将其hide。
针对此需求,整理了三种实现方式,大家按实际情况选择。
当然,我们做项目肯定会用到UI框架,常见的Element中的组件提供了这样的方法。
但是,就算使用框架,有些时候还是要用到的,比如:
Element中的Popover,当我们想使用手动方式(trigger触发方式为manual时)控制它的show&hide的时候,就要自己实现这个功能啦。
第一种方式:最普通的手动监听判断
啦啦啦
show
data(){ return{ visible:false } }, methods:{ show(){ document.addEventListener('click',this.hidePanel,false) }, hide(){ document.removeEventListener('click',this.hidePanel,false) }, hidePanel(e){ if(!this.$refs.projectButton.contains(e.target)){ this.visible=false this.hide() } } }
上面就是在Popovershow的时候监听document的click事件,触发进入hidePanel方法,判断当前点击的el是否在Popover内部,如果不在,则手动hidePopover,并且移除监听事件。
这个还是蛮好理解的,我使用的也是这种方式,因为我的项目中需要这种需求的很少(好吧,就一个地方),所以我采用了这种方式。
第二种方式:指令
显示
上面这种是网上比较火的一种方式(实际我没有测试过),其实思路还是那个思路(给document增加一个click事件监听,当发生click事件的时候判断是否点击的当前对象,不是就隐藏),优点就是可以封装成全局/局部的指令,可多处使用。
下面简单介绍下vue指令
一个指令定义对象可以提供如下几个钩子函数(均为可选):
- bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
- inserted:被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。
- update:所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新(详细的钩子函数参数见下)。
- componentUpdated:指令所在组件的VNode及其子VNode全部更新后调用。
- unbind:只调用一次,指令与元素解绑时调用。
第三种方式:遮罩