You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加<transition-group>后vuedraggable报错:需存在item插槽

解决vuedraggable结合transition-group时的"draggable element must have an item slot"错误

错误原因很明确:当你把<transition-group>嵌套在<draggable>内部,并将item插槽放在transition-group里时,draggable组件无法直接识别到顶层的item插槽,不符合组件对插槽结构的要求。

下面是两种可行的解决方式:

方式一:使用默认插槽结合transition-group(推荐,适合全局列表过渡)

放弃item插槽用法,直接在draggable的默认插槽中放置transition-group,通过v-for渲染列表项,这样draggable能正确识别可拖拽元素:

<draggable :list="listRows" item-key="listID" class="list-group">
  <transition-group tag="div" name="sort-transition">
    <div 
      v-for="item in listRows" 
      :key="item.listID" 
      class="list-group-item"
    >
      {{ item.name }}
    </div>
  </transition-group>
</draggable>

注意事项:

  • transition-group必须指定tag属性(比如示例中的div),它需要一个根元素来包裹列表项,默认span可能会影响布局和拖拽行为。
  • name属性对应过渡动画的CSS类前缀,你可以自定义名称,然后编写对应的过渡样式:
    .sort-transition-enter-active,
    .sort-transition-leave-active {
      transition: all 0.3s ease;
    }
    .sort-transition-enter-from,
    .sort-transition-leave-to {
      opacity: 0;
      transform: translateY(10px);
    }
    .sort-transition-move {
      transition: transform 0.3s ease;
    }
    

方式二:在item插槽内部嵌套transition-group(适合单个项的过渡)

如果你需要给每个列表项单独添加过渡,可以把transition-group放在item插槽内部,但注意每个插槽只渲染一个元素,需要给transition-group指定唯一key:

<draggable :list="listRows" item-key="listID" class="list-group">
  <template #item="{ element }">
    <transition-group tag="div" name="item-transition" :key="element.listID">
      <div class="list-group-item">
        {{ element.name }}
      </div>
    </transition-group>
  </template>
</draggable>

内容的提问来源于stack exchange,提问作者RGriffiths

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:40:34