强制折叠 Vuetify v-list-group 中的所有活动项目

Aye*_*azo 4 javascript vue.js vuetify.js

我正在使用 构建一个永久抽屉内的导航,v-list并且按照指南完成了它。

当抽屉折叠时,它只显示图标,悬停时它会展开,显示导航项的名称。

有几个项目是组,如果我单击它们,我可以看到子项目。

当我希望在抽屉折叠时强制折叠活动子项目时,就会出现问题。

这是代码:

<v-navigation-drawer
  v-model="mainSidebarDrawer"
  :mini-variant.sync="mini"
  fixed
  expand-on-hover
  permanent
>
  <v-list>
    <template v-for="(n, i) in nav">
      <v-list-item v-if="n.to" :key="`${i}-a`" :to="n.to" link>
        <v-list-item-icon>
          <v-icon small>{{ n.icon }}</v-icon>
        </v-list-item-icon>
        <v-list-item-content>
          <v-list-item-title>{{ n.label }}</v-list-item-title>
        </v-list-item-content>
      </v-list-item>
      <v-list-group
        v-if="n.subItems"
        :key="`${i}-b`"
        :prepend-icon="`${n.icon} fa-em`"
        :value="subItemsValue" // this looks always false
        append-icon="fas fa-chevron-down fa-sm"
      >
        <template v-slot:activator>
          <v-list-item-content>
            <v-list-item-title>{{ n.label }}</v-list-item-title>
          </v-list-item-content>
        </template>
        <v-list-item
          v-for="(s, y) in n.subItems"
          :key="y"
          :to="s.to"
          link
          class="pl-8"
        >
          <v-list-item-icon>
            <v-icon small>{{ s.icon }}</v-icon>
          </v-list-item-icon>
          <v-list-item-content>
            <v-list-item-title>{{ s.label }}</v-list-item-title>
          </v-list-item-content>
        </v-list-item>
      </v-list-group>
    </template>
  </v-list>
</v-navigation-drawer>
Run Code Online (Sandbox Code Playgroud)

Vue 代码有:

data() {
  return {
    mainSidebarDrawer: true,
    mini: true,
    subItemsValue: false
  }
}
Run Code Online (Sandbox Code Playgroud)

所以,回顾一下:

  1. 抽屉已折叠,仅显示导航列表的图标
  2. 悬停时展开,图标和文本可见
  3. 单击列表组会展开子项目
  4. 将鼠标移离抽屉会导致抽屉像第 1 点一样折叠
  5. 列表组保持扩展状态。我想把它折叠回去

到目前为止,我尝试的是在mini酒店聆听并执行以下操作:

<v-navigation-drawer
  ...
  @update:mini-variant="collapseSubItems"
</v-navigation-drawer>

methods: {
  collapseSubItems() {
    if (this.mini) {
      this.subItemsValue = false
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是subItemsValue永远不会改变。我也尝试将其移动到v-model.

怎样才能达到我的结果呢?谢谢

Zim*_*Zim 6

我认为不要使用像这样的单个变量subItemsValue,而是在每个项目上使用“活动”状态变量nav。然后使用该transitionend事件将打开的导航项设置为返回active: false...

<v-navigation-drawer
      v-model="mainSidebarDrawer"
      permanent
      expand-on-hover
      @transitionend="collapseSubItems"
    >
    <v-list>
        <template v-for="(n, i) in nav">
          <v-list-item v-if="n.to" :key="`${i}-a`" :to="n.to" link>
            <v-list-item-icon>
              <v-icon small>{{ n.icon }}</v-icon>
            </v-list-item-icon>
            <v-list-item-content>
              <v-list-item-title>{{ n.label }}</v-list-item-title>
            </v-list-item-content>
          </v-list-item>
          <v-list-group
            v-if="n.subItems"
            :key="`${i}-b`"
            :prepend-icon="`${n.icon} fa-em`"
            v-model="n.active"
            append-icon="fas fa-chevron-down fa-sm"
          >
            <template v-slot:activator>
              <v-list-item-content>
                <v-list-item-title>{{ n.label }}</v-list-item-title>
              </v-list-item-content>
            </template>
            <v-list-item
              v-for="(s, y) in n.subItems"
              :key="y"
              :to="s.to"
              link
              class="pl-8"
            >
              <v-list-item-icon>
                <v-icon small>{{ s.icon }}</v-icon>
              </v-list-item-icon>
              <v-list-item-content>
                <v-list-item-title>{{ s.label }}</v-list-item-title>
              </v-list-item-content>
            </v-list-item>
          </v-list-group>
        </template>
     </v-list>
 </v-navigation-drawer>

 collapseSubItems() {
      this.nav.map((item)=>item.active=false)
 },
Run Code Online (Sandbox Code Playgroud)

演示: https: //codeply.com/p/qzrKTPSzrB