You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vuetify 3 嵌套列表中合并v-hover与v-list-group activator插槽props的实现问题

Vuetify 3 嵌套列表中合并v-hover与v-list-group activator插槽props的实现问题

我完全懂你碰到的这个麻烦——在嵌套列表里同时用v-hoverv-list-group的activator插槽时,俩插槽都返回了需要绑定到v-list-itemprops对象,直接用的话后一个会把前一个覆盖,要么悬停功能失效,要么列表组的折叠展开不好使。其实解决思路很简单,就是把这两个props对象合并起来就好啦!

核心解决方法

问题出在你当前的代码里,两个插槽的props变量名冲突了,而且没有合并它们的属性。我们只需要:

  • 给两个插槽的props分别起不同的名字,避免变量冲突
  • 使用对象扩展运算符...把两个props对象合并后,再绑定到v-list-item

这样就能同时保留v-list-group的折叠激活逻辑和v-hover的悬停状态绑定啦。

修改后的treeBranch.vue代码

<template>
  <template v-for="(item,i) in list" :key="item.title">
    <!-- 处理有子项的列表组 -->
    <template v-if="item.childsCategory.length">
      <v-list-group subgroup fluid>
        <!-- 重命名activator的props为activatorProps -->
        <template v-slot:activator="{ props: activatorProps }">
          <!-- 重命名v-hover的props为hoverProps -->
          <v-hover v-slot="{ isHovering, props: hoverProps }">
            <!-- 合并两个props对象后绑定 -->
            <v-list-item v-bind="{ ...activatorProps, ...hoverProps }" :value="item.title">
              <v-list-item-title>{{ item.title }}</v-list-item-title>
              <template v-slot:append>
                <v-icon icon="$mdiInformationOutline"></v-icon>
                <v-btn 
                  variant="text" 
                  size="small" 
                  icon="$mdiDotsVertical"
                  :class="isHovering ? 'visible-btns': 'hidden-btns'"
                ></v-btn>
              </template>
            </v-list-item>
          </v-hover>
        </template>
        <treeBranch :list="item.childsCategory" :options="options"/>
      </v-list-group>
    </template>

    <!-- 处理无子项的普通列表项 -->
    <template v-else>
      <v-hover v-slot="{ isHovering, props }">
        <v-list-item :value="item.title" density="compact" v-bind="props">
          <v-list-item-title>{{ item.title }}</v-list-item-title>
          <template v-slot:append>
            <v-icon icon="$mdiInformationOutline"></v-icon>
            <v-btn 
              variant="text" 
              size="small" 
              icon="$mdiDotsVertical"
              :class="isHovering ? 'visible-btns': 'hidden-btns'"
            ></v-btn>
          </template>
        </v-list-item>
      </v-hover>
    </template>
  </template>
</template>

为什么这样有效?

  • v-list-groupactivatorProps里包含了展开/折叠所需的click事件、aria属性等绑定,确保列表组的折叠功能正常
  • v-hoverhoverProps里包含了鼠标悬停相关的事件监听和状态绑定,确保悬停时按钮能正常显示
  • { ...activatorProps, ...hoverProps }合并后,两个对象的属性会被整合到一起,不会互相覆盖(如果有重复属性,后面的hoverProps会覆盖前面的,但这里两者的属性基本没有重叠,所以完全没问题)

备注:内容来源于stack exchange,提问作者Dima L

火山引擎 最新活动