Vue JS 2.6.10
Я прочитал множество SO-сообщений о том, как создать пользовательскую директиву, чтобы вы могли обнаружить щелчок за пределами всплывающего меню и закрыть его.,Я не могу заставить его работать, потому что у меня есть кнопка, которая открывает меню, и нажатие на нее запускает поведение «закрыть».
Вот мой основной вид Logbook.vue
, который имеетКнопка, которая открывает меню: ![enter image description here](https://i.stack.imgur.com/45GWk.png)
// --- Logbook.vue ---
<script>
export default {
name: 'Logbook',
components:{
Years
},
methods:{
clickYears: function(){
this.$refs.Years.show = true
}
}
}
</script>
<template>
<div id="current-year">
<a href="#year" ref="yearButton" v-on:click.prevent="clickYears">{{ currentYear }}</a>
<Years ref="Years" v-on:selectYear="yearSelected" />
</div>
</template>
Вот компонент меню Years.vue
, который открывается при нажатии кнопки: ![enter image description here](https://i.stack.imgur.com/IrUOs.png)
//--- Years.vue ---
<script>
import Vue from 'vue'
//Custom directive to handle clicks outside of this component
Vue.directive('click-outside', {
bind: function (el, binding, vnode) {
window.event = function (event) {
if (!(el == event.target || el.contains(event.target))) {
vnode.context[binding.expression](event)
}
};
document.body.addEventListener('click', window.event)
},
unbind: function (el) {
document.body.removeEventListener('click', window.event)
}
})
export default{
name: 'Years',
data() {
return {
show: false
}
},
methods:{
close: function(){
this.show = false
}
}
}
</script>
<template>
<div id="years" v-show="show" v-click-outside="close">
<!-- Years listed here... -->
</div>
</template>
Метод close
срабатывает надлежащим образом, когда я щелкаю вне компонента Years
, но проблема в том, что я не могу открыть меню Years
, чтобыНачнем с того, что нажатие кнопки также запускает поведение close
, потому что оно также вне компонента Years.
Кто-нибудь преодолевал эту проблему?Есть идеи?