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

Vue3中transition-group的v-leave生效但v-enter-active不生效问题求助

问题根因分析
  • transition-group入场动画失效的原因:transition-group是为列表元素过渡设计的,要求所有直接子元素必须绑定唯一的key属性,且需要Vue能追踪每个子元素的身份变化。你直接将v-if加在<slot>上,且slot展开的多个子元素没有绑定key,Vue无法识别元素的插入状态,因此入场过渡类不会被正确添加。退场时因为是批量移除元素,Vue的过渡检测逻辑刚好能触发,所以退场动画正常。
  • 替换为<transition>后只显示第一个子元素的原因:<transition>仅支持包裹单个根元素做过渡,你使用组件时传入了两个根节点(wrapper1-for-contents和wrapper2-for-contents),<transition>只会识别第一个根元素,第二个会被直接忽略。
解决方案

推荐采用单根节点包裹+transition的方案,改造成本最低,对组件使用方无额外要求。修改你的组件模板代码如下:

<template>
  <div id='accordion'>
    <div
      :id="['accordion', id, 'collapsible-wrapper'].join('-')"
      class="collapsible-wrapper">
      <div
        id='toggle-content'
        :class="(collapsed ? 'icon-plus green flip expand-content-button': 'icon-minus green flip expand-content-button')"
        @click="collapsed = !collapsed">
      </div>
    </div>
    <transition name="accordion">
      <!-- 新增唯一根节点包裹slot,将v-if绑定在该节点上 -->
      <div class="accordion-content" v-if="!collapsed">
        <slot></slot>
      </div>
    </transition>
  </div>
</template>

修改后不需要调整原有CSS和组件使用方式,即可同时满足所有slot内容正常渲染、入场/退场动画都正常触发的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:57:00