首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在单击菜单项后关闭下拉菜单

如何在单击菜单项后关闭下拉菜单
EN

Stack Overflow用户
提问于 2021-03-29 02:59:42
回答 2查看 334关注 0票数 2

我有一个使用NUXT JS和顺风CSS的下拉菜单,但nuxt-js有问题,因为它不会使用SSR更改页面下拉菜单不会关闭如何在单击菜单项时关闭下拉菜单

这是模板

代码语言:javascript
复制
      <!-- dropdown -->
      <button class="mt-1 block px-2 py-1 text-white font-semibold rounded hover:bg-gray-800 sm:mt-0 sm:ml-2"
        type="button" v-on:click="toggleDropdown()" ref="btnDropdownRef">
        Applications
      </button>
      <div v-bind:class="{'hidden': !dropdownPopoverShow, 'block': dropdownPopoverShow}"
        class="bg-gray-800 w-full md:w-1/5 text-white z-50 float-left py-2 list-none text-left rounded shadow-lg mt-1"
         ref="popoverDropdownRef">
        <NuxtLink class="mt-1 font-semibold block px-2 py-1 text-white  rounded hover:bg-gray-800 sm:mt-0 sm:ml-2" to="/applications/education">
        education
        </NuxtLink>
        <NuxtLink class="mt-1 font-semibold block px-2 py-1 text-white  rounded hover:bg-gray-800 sm:mt-0 sm:ml-2" to="/applications/lifescience">
        life sciences 
        </NuxtLink>
        <NuxtLink class="mt-1 font-semibold block px-2 py-1 text-white  rounded hover:bg-gray-800 sm:mt-0 sm:ml-2" to="/applications/education">
        media
        </NuxtLink>
        <NuxtLink class="mt-1 font-semibold block px-2 py-1 text-white  rounded hover:bg-gray-800 sm:mt-0 sm:ml-2" to="/">
        industries
        </NuxtLink>
        <NuxtLink class="mt-1 font-semibold block px-2 py-1 text-white  rounded hover:bg-gray-800 sm:mt-0 sm:ml-2" to="/">
        agriculture
        </NuxtLink>
      </div>

这就是脚本

代码语言:javascript
复制
<script>
  import {
    createPopper
  } from "@popperjs/core";

  export default {
    data() {
      return {
        isOpen: false,
        dropdownPopoverShow: false,
      }
    },
    methods: {
      toggleDropdown: function () {
        if (this.dropdownPopoverShow) {
          this.dropdownPopoverShow = false;
        } else {
          this.dropdownPopoverShow = true;
          createPopper(this.$refs.btnDropdownRef, this.$refs.popoverDropdownRef, {
            placement: "bottom-start"
          });
        }
      }
    }
  }
</script>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-01 11:03:43

我最终使用了watch route方法。

代码语言:javascript
复制
 watch: {
    '$route' () {
      // this will close the dropdown
      this.dropdownPopoverShow = false,  
      // this will close the mobile menu on page change
      this.isOpen = false
    }
票数 0
EN

Stack Overflow用户

发布于 2021-03-29 05:01:32

您可以使用Vue路由器实例上的afterEach挂钩,将一个方法设置为在每次页面更改时运行。我建议将其设置为Nuxt中的一个插件,并将dropdownPopoverShow从您的导航组件移动到存储中。

dropdownPopoverShow移动到存储中,以便可以在您的nav组件之外引用它。

代码语言:javascript
复制
export const state = () => ({
  dropdownPopoverShow: false
})

export const mutations = {
  toggleDropdown(state) {
    // no need for an 'if/then', just toggle the Boolean
    state.dropdownPopoverShow = !state.dropdownPopoverShow
  },
  hideDropdown(state) {
    state.dropdownPopoverShow = false
  }
}

在您的nav组件中,调用存储中的突变。

代码语言:javascript
复制
methods: {
  toggleDropdown() {
    this.$store.commit('toggleDropdown')
  }
}

最后,创建一个插件,在每次路由更改后将dropdownPopoverShow设置为false。

代码语言:javascript
复制
// plugins/hideDropdown.js:
export default async ({ app, store }) => {
  app.router.afterEach((to, from) => {
    store.commit('hideDropdown')
  });
}

请记住将插件添加到nuxt配置中:

代码语言:javascript
复制
plugins: [ { src: '~/plugins/hideDropdown.js', mode: 'client' } ]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66845119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档