通过单击外部(组件)在 Vuejs 中隐藏下拉菜单

Posted

技术标签:

【中文标题】通过单击外部(组件)在 Vuejs 中隐藏下拉菜单【英文标题】:Hiding a dropdown in Vuejs by clicking outside (component) 【发布时间】:2019-10-27 01:28:06 【问题描述】:

我正在一个 Vuejs 项目上创建一个菜单组件。这个菜单有 2 个下拉菜单,我已经创建了一些方法并使用了 Vue 指令,所以当我单击其中 1 个时,其他隐藏,反之亦然,我还想知道如何通过单击外部来隐藏它们。

我尝试了 2 个 Vue 库,但对我不起作用。另外,如果可能的话,我想手动而不是外部执行此操作。

html

<!-- menu -->
<div>
  <ul>
    <li><span>Home</span></li>
    <li v-on:click="toggle1(), dropAreas =! dropAreas">
      <span>Areas</span>
    </li>
    <li v-on:click="toggle2(), dropAdmin =! dropAdmin">
      <span>Administration</span>
    </li>
  </ul>
</div>
<!-- /menu -->
<!-- dropdowns-->
<div v-if="dropAreas">
  <ul>
    <li>
      <span>Kitchen</span>
    </li>
    <li>
      <span>Baths</span>
    </li>
  </ul>
</div>
<div v-if="dropAdmin">
  <ul>
    <li>
      <span>Profile</span>
    </li>
    <li>
      <span>Services</span>
    </li>
  </ul>
</div>
<!-- /dropdowns-->

JS

data () 
    return 
      dropAreas: false,
      dropAdmin: false
    
  ,
  methods: 
    toggle1 () 
      if (this.dropAdmin === true) 
        this.dropAdmin = false
      
    ,
    toggle2 () 
      if (this.dropAreas === true) 
        this.dropAreas = false
      
    
  

*此代码在另一个组件“Home”中被调用,如下所示:

<template>
  <div>
    <menu></menu>
    <!-- [...] -->
  </div>
</template>

关于如何手动完成的任何想法?可能吗?谢谢。

【问题讨论】:

这个你试过了吗:github.com/vue-bulma/click-outside#readme 如果我做对了,这应该可以帮助你:***.com/questions/36170425/… 它应该但它对我不起作用......我认为问题是我在另一个组件上调用菜单并且由于组件在 Vue 中是隔离的,所以整体示例不为我工作... 【参考方案1】:

这有点小技巧,但您可以使用 tabindex HTML attribute 和 :focus CSS pseudo-class 来做到这一点:

new Vue(

  el: '#app',
  template: `
    <div class="container">
      <div
      ref="menu"
      id="menu"
      tabindex="0"
      >Menu</div>
      <ul id="dropdown">
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
      </ul>
    </div>
  `

);
#menu 
  display: inline-block;
  padding: 1em;
  border: 1px solid #e6e6e6;
  cursor: pointer;


#dropdown 
  display: none;


#menu:focus + #dropdown 
  display: block;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>

<div id="app"></div>

【讨论】:

谢谢!其实我是在用 SCSS/SASS 做这个项目,这会一样吗? @helleworld_ 是的,它会起作用。如果你写对了,你的 SCSS/SASS 也会被转换成 CSS。但我必须提到tabindex 会干扰浏览器的本机选项卡序列。所以只有在它不会破坏你的 UI/UX 时才使用它

以上是关于通过单击外部(组件)在 Vuejs 中隐藏下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

在 div 下拉菜单之外单击时隐藏,但未显示切换

单击外部编辑器时,Angular js Summernote 下拉菜单未关闭

Vue JS - 如何隐藏以前的下拉内容

单击其他地方时触发组件方法

在 React 中单击组件外部时更改状态

mouseenter 上的 angular-bootstrap 下拉菜单,并在单击之前保持下拉菜单隐藏。