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

标签 javascript drop-down-menu vue.js vuejs2 vue-component

我在 vuejs 中使用 dropdown 菜单组件来制作普通的下拉菜单。 我的代码用于 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>

现在,我通过在模板中使用以下代码,在我的 VUE 应用中的各个位置导入 dropdown 组件

<dropdown>
    <li>
         Action
    </li>
</dropdown>

现在一切正常,但我希望同时只有一个下拉菜单处于事件状态。

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

最佳答案

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

<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>

关于javascript - 如果我们在vuejs中的菜单外单击,如何隐藏下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46038989/

相关文章:

javascript - 我如何在 JavaScript 中计算这个数学公式

javascript - 调用其他 php 页面的脚本不起作用

javascript - 为什么在 firefox 中它没问题,但在 ie8 中它打印 'undefined undefined' ?

javascript - PHP 和 MySQL 中的动态下拉列表

javascript - 如何过滤存储在 jQuery 变量中的数据

html - 更改 Bootstrap 下拉以向右水平放置

javascript - 闪烁的下拉菜单

javascript - 如何在 Vue js 中在线引用图片?

javascript - 是什么导致无法检测到此 Vue 3 应用程序中 html 元素外部的单击事件?

vue.js - 使用 vue.js 在不刷新页面的情况下更改后更新数据