【问题标题】:Parent Vuetify VMenu Not Closing When Child Selected选择子项时父级 Vuetify VMenu 未关闭
【发布时间】:2018-12-28 14:32:38
【问题描述】:

我的应用通过 for 循环动态创建它的主导航,以生成嵌套的 vmenu 和 vlist。它正确生成。问题是当用户单击嵌套菜单中的链接时,父菜单保持打开状态。我已经尝试过在主菜单和嵌套菜单上单击时关闭和内容单击时关闭,但这不起作用。

我的 codepen 有一个简化的例子。如果您选择 MENU 1,然后将鼠标悬停在 Subitem 1-1 上并单击 Subitem 1-1-1,该即时菜单将关闭,但主菜单保持打开状态。

My codepen.

<div id="app">
  <v-app id="inspire">
    <v-container>
      <!-- top level menu -->
      <v-menu
        v-for="(menu,index) in menus"
        :key="`menu-${index}`"
        offset-y
        close-on-click
        @click="route()"
      >
        <v-btn
          flat
          primary
          slot="activator"
        >{{ menu.title }}</v-btn>
        <!-- each item on a menu  ..  is a menuitem -->
        <v-list dense>
          <v-list-tile
            v-for="(menuitem,index) in menu.items"
            :key="`menuitem-${index}`"
            @click="route()"
          >
            <!-- or a popout of submenu items -->
            <v-list-tile-content>
              <v-menu
                offset-x
                open-on-hover
                close-on-click
              >
                <v-list-tile
                  slot="activator"
                  @click="route()"
                >
                  <v-list-tile-title>{{ menuitem.title }}</v-list-tile-title>
                  <v-list-tile-action
                    class="justify-end"
                    v-if="menuitem.items"
                  >
                    <v-icon primary>arrow_right</v-icon>
                  </v-list-tile-action>
                </v-list-tile>
                <v-list
                  dense
                  v-if="menuitem.items"
                >
                  <v-list-tile
                    v-for="(menusubitem,index) in menuitem.items"
                    :key="`menusubitem-${index}`"
                    @click="route()"
                  >
                    <v-list-tile-title>{{ menusubitem.title }}</v-list-tile-title>
                  </v-list-tile>
                </v-list>
              </v-menu>
            </v-list-tile-content>
          </v-list-tile>
        </v-list>
      </v-menu>
    </v-container>
  </v-app>
</div>

以及相关的脚本。

new Vue({
  el: '#app',
  data: () => ({    
    menus: [
      {
        title: 'MENU 1',
        items: [
          { title: 'Subitem 1-1',
            items: [

              { title: 'Subitem 1-1-1' },
              { title: 'Subitem 1-1-2' }
            ]
          },
          { title: 'Subitem 1-2' },
          { title: 'Subitem 1-3' }
        ]  
      },
      {
        title: 'MENU 2',
      },
      {
        title: 'MENU 3',
        items: [
          { title: 'Subitem 3-1' },
          { title: 'Subitem 3-2' },
        ]  
      }]
  }),
  methods: {
    route() {
      console.log("replace with router")
    } 
  }
})

【问题讨论】:

    标签: vue.js navigation vuetify.js


    【解决方案1】:

    一种选择是通过isActive 属性显式访问和关闭父菜单:

    route(parentMenuIndex) {
      if (arguments.length) {
          const parentMenu = this.$refs.menuRef[parentMenuIndex];
          parentMenu.isActive = false;
      }
    }
    

    其中this.$refs.menuRef 用于通过ref attribute 访问父 菜单组件:

    <v-menu
          v-for="(menu,index) in menus"
          :key="`menu-${index}`"
          offset-y
          close-on-click
          close-on-content-click
          ref="menuRef"
    >
    ...
    </v-menu>
    

    这是updated CodePen

    【讨论】:

    • 谢谢。当我运行更新的 codepen 时,它对第一个子项正确执行,但不是第二个子项。在点击事件方法中查看“parentMenu.isActive”时,第二项总是false。
    • @mdb,确实,为第二个子菜单传递了错误的父菜单索引,codepen已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多