自定义指令
directives: {
'click-outside': {
bind: function (el, binding, vnode) {
console.log('el',el);
el.event = function (event) {
if (!(el == event.target || el.contains(event.target))) {
if (typeof vnode.context[binding.expression] == 'function') {
vnode.context[binding.expression](event)
}
}
}
document.body.addEventListener('click', el.event, true)
},
unbind: function (el) {
document.body.removeEventListener('click', el.event, true)
},
},
},
完整使用
<template>
<div>
<!-- 这是基于 bootstrap 常见的下拉菜单样式 -->
<div class="row" style="margin-left: 20px;">
<label class="mr5" style="font-size: 14px;">下拉菜单</label>
<!-- v-click-outside 绑定方法名 -->
<div class="btn-group" v-click-outside="closeMenu">
<!-- 这里点击会切换菜单是否可见 -->
<button
type="button"
class="btn btn-default dropdown-toggle"
@click="isMenuShown = !isMenuShown"
>
点击 <span class="caret"></span>
</button>
<ul v-show="isMenuShown" class="dropdown-menu" style="display:block;">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
isMenuShown: false
};
},
directives: {
'click-outside': {
bind: function (el, binding, vnode) {
console.log('el',el);
el.event = function (event) {
if (!(el == event.target || el.contains(event.target))) {
if (typeof vnode.context[binding.expression] == 'function') {
vnode.context[binding.expression](event)
}
}
}
document.body.addEventListener('click', el.event, true)
},
unbind: function (el) {
document.body.removeEventListener('click', el.event, true)
},
},
},
methods: {
closeMenu(ev) {
console.log({ ev });
this.isMenuShown = false;
}
}
};
</script>