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
相关产品推荐
相关产品推荐

