如果我们在 vuejs 的菜单外单击,如何隐藏下拉菜单

Rak*_*oni 15 javascript drop-down-menu vue.js vue-component vuejs2

dropdown在 vuejs 中使用菜单组件来制作普通的下拉菜单。我的dropdown组件代码是:

<template>
    <span class="dropdown" :class="{shown: state}">
        <a href="#" @click.prevent="toggleDropdown" class="dropdown-toggle">toggle menu</a>
            <div class="dropdown-menu" v-show="state">
                <ul class="list-unstyled">
                    <slot></slot>
                </ul>
            </div>
        </transition>
    </span>
</template>

<script>
export default {
    name: 'dropdown',
    data () {
        return {
            state: false
        }
    },
    methods: {
        toggleDropdown (e) {
            this.state = !this.state;
        }
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

现在我通过在模板中使用以下代码在dropdown我的VUE应用程序中的不同位置导入组件

<dropdown>
    <li>
         Action
    </li>
</dropdown>
Run Code Online (Sandbox Code Playgroud)

现在工作正常,但我希望同时只有一个下拉菜单处于活动状态。

我做了很少的研究,发现我可以使用像https://github.com/davidnotplay/vue-my-dropdown这样的插件,但我不想使用它。同样,我还研究了上述示例的工作原理,但我想以我的dropdown组件处理与下拉菜单相关的所有事件的方式来实现此下拉菜单功能。那么你能帮我实现这个目标吗?

kgo*_*ski 30

我知道这是一个很老的问题,但我认为最好的方法是在没有任何外部插件的情况下将点击侦听器添加到已安装的生命周期挂钩(并在 beforeDestroy 挂钩上将其删除)并过滤组件上的点击,以便它仅在在外面点击。

<template>
    <span class="dropdown" :class="{shown: state}">
      <a href="#" @click.prevent="toggleDropdown" class="dropdown-toggle">toggle menu</a>
            <div class="dropdown-menu" v-show="state">
                <ul class="list-unstyled">
                    <slot></slot>
                </ul>
            </div>
        <transition/>
    </span>
</template>

<script>
export default {
  name: 'dropdown',
  data () {
    return {
      state: false
    }
  },
  methods: {
    toggleDropdown (e) {
      this.state = !this.state
    },
    close (e) {
      if (!this.$el.contains(e.target)) {
        this.state = false
      }
    }
  },
  mounted () {
    document.addEventListener('click', this.close)
  },
  beforeDestroy () {
    document.removeEventListener('click',this.close)
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)