v-leave-active 动画工作,但 v-enter-active 动画不适用于 <transition-group>

Posted

技术标签:

【中文标题】v-leave-active 动画工作,但 v-enter-active 动画不适用于 <transition-group>【英文标题】:v-leave-active animation working but v-enter-active animation not working for <transition-group> 【发布时间】:2021-11-11 12:31:59 【问题描述】:

我正在使用 Vue 3,并且我构建了一个名为 Accordion 的自定义组件。它的功能是在单击按钮时显示和隐藏其中的内容(我使用 div 来制作按钮而不是 &lt;button&gt; 标签)。 Accordion(我的自定义组件)对传入元素使用 &lt;slot&gt;

&lt;slot&gt;&lt;transition-group&gt; 内 手风琴模板看起来像这样

<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-group name="accordion">
      <slot v-if="!collapsed"></slot>
    </transition-group>
  </div>
</template>

这应该起作用的方式是,当单击“切换内容”div 时,&lt;slot&gt; 中的内容应该在一点动画之后显示,并且当再次单击切换内容 div 时,它应该随着一些动画消失。 现在,当&lt;slot&gt;中的内容消失时,我的动画正在运行,但是在显示内容之前的动画不起作用或由于某种原因没有显示,但我的内容正在显示。

这是我的动画 CSS 代码:

.accordion-enter-active
  transition: all 0.3s ease-out;


.accordion-leave-active 
  transition: all 0.8s cubic-bezier(1, 0.5, 0.8, 1);


.accordion-enter-from,
.accordion-leave-to 
  transform: translateX(20px);
  opacity: 0;
 

这就是我使用 Accordion 组件的方式:

    <Accordion
      :id="1">
      <div class="wrapper1-for-contents">
        <div>
           Some Stuff here
        </div>
        <div>
           Some more stuff here
        </div>
      </div>
      <div class="wrapper2-for-contents">
        <div>
          Some Stuff here
        </div>
        <div>
          Some more stuff here
        </div>
      </div>
   </Accordion>

当我使用&lt;transition&gt; 而不是&lt;transition-group&gt; 时,显示内容之前的动画有效,但并非我的所有内容都显示出来。只有第一个 div(带有 class="wrapper1-for-contents")和它的孩子出现,而我的第二个 div(class="wrapper2-for-contents")和它的孩子没有出现。

我看到了一个类似的问题 here,但该解决方案对我不起作用

我不知道我在这里做错了什么,有人可以帮助我吗?

【问题讨论】:

【参考方案1】:

您可以尝试添加mode

<transition-group name="accordion" mode="out-in">

还有动画:

.accordion-enter-active,
.accordion-leave-active 
  transition: all 0.8s cubic-bezier(1, 0.5, 0.8, 1);


.accordion-enter-active 
  transition-delay: .3s;


.accordion-enter-from,
.accordion-leave-to 
  transform: translateX(20px);
  opacity: 0;
 

【讨论】:

感谢您的回复,但我试过了,但它不起作用。同样的问题仍然存在 现在试试吧,求求你,我更新了答案 再次感谢,我试过了,但同样的问题仍然存在,本应在显示内容之前发生的动画没有发生,内容立即显示,但内容消失时的动画仍然有效【参考方案2】:

尝试将“出现”属性添加到&lt;transition-group&gt; 标记

&lt;transition-group name="accordion" appear&gt;

【讨论】:

【参考方案3】:

我能够解决这个问题,虽然我不知道为什么它不起作用 当我将手风琴组件的内部(在我设置 id="1" 之前)包裹在一个 div 中时,动画效果很好

抱歉更新晚了

【讨论】:

以上是关于v-leave-active 动画工作,但 v-enter-active 动画不适用于 <transition-group>的主要内容,如果未能解决你的问题,请参考以下文章

Vue封装的过渡与动画

在Vue中同时使用过渡和动画

vue切换组件动画 / vue-transition过渡动画

vue的transition-group实现列表的添加和删除动画

几何学中的欧拉公式:V-E+F = 2

AnimatedSwitcher 没有按预期工作?小部件更改但没有动画