Passer au contenu

TransitionGroup

<TransitionGroup> est un composant natif conçu pour animer l'insertion, la suppression et le changement d'ordre des éléments ou des composants qui sont rendus dans une liste.

Différences avec <Transition>

<TransitionGroup> prend en charge les mêmes props, classes de transition CSS et écouteurs de hooks JavaScript que <Transition>, avec les différences suivantes :

  • Par défaut, il ne rend pas d'élément en contenant d'autres. Mais vous pouvez spécifier un élément à rendre avec la prop tag.

  • Les modes de transition ne sont pas disponibles, car nous n'alternons plus entre des éléments qui s'excluent mutuellement.

  • Les éléments à l'intérieur sont contraints de toujours avoir un attribut unique key.

  • Les classes de transition CSS seront appliquées aux éléments individuels de la liste, pas au groupe/conteneur lui-même.

TIP

Lorsqu'il est utilisé dans les templates du DOM, il doit être référencé comme <transition-group>.

Transitions d'Entrée / Sortie

Voici un exemple d'application des transitions d'entrée / sortie dans une liste v-for en utilisant <TransitionGroup> :

template
<TransitionGroup name="list" tag="ul">
  <li v-for="item in items" :key="item">
    {{ item }}
  </li>
</TransitionGroup>
css
.list-enter-active,
.list-leave-active {
  transition: all 0.5s ease;
}
.list-enter-from,
.list-leave-to {
  opacity: 0;
  transform: translateX(30px);
}
  • 1
  • 2
  • 3
  • 4
  • 5

Transitions de mouvements

La démonstration ci-dessus présente des défauts évidents : lorsqu'un élément est inséré ou retiré, les éléments qui l'entourent "sautent" instantanément au lieu de se déplacer en douceur. Nous pouvons corriger ce problème en ajoutant quelques règles CSS supplémentaires :

css
.list-move, /* appliquer la transition aux éléments mobiles */
.list-enter-active,
.list-leave-active {
  transition: all 0.5s ease;
}

.list-enter-from,
.list-leave-to {
  opacity: 0;
  transform: translateX(30px);
}

/* s'assure que les éléments sortants sont retirés du flux de la mise en page afin que le déplacement
   des animations soit calculé correctement. */
.list-leave-active {
  position: absolute;
}

Maintenant, c'est beaucoup mieux - elle s'anime même en douceur lorsque la liste entière est mélangée :

  • 1
  • 2
  • 3
  • 4
  • 5

Exemple complet

Échelonner des transitions de liste

En communiquant avec les transitions JavaScript par le biais d'attributs de données, il est également possible d'échelonner les transitions dans une liste. Tout d'abord, nous rendons l'index d'un élément comme un attribut de données sur l'élément du DOM :

template
<TransitionGroup
  tag="ul"
  :css="false"
  @before-enter="onBeforeEnter"
  @enter="onEnter"
  @leave="onLeave"
>
  <li
    v-for="(item, index) in computedList"
    :key="item.msg"
    :data-index="index"
  >
    {{ item.msg }}
  </li>
</TransitionGroup>

Ensuite, dans les hooks JavaScript, nous animons l'élément avec un délai basé sur l'attribut de données. Cet exemple utilise la bibliothèque GreenSock pour réaliser l'animation :

js
function onEnter(el, done) {
  gsap.to(el, {
    opacity: 1,
    height: '1.6em',
    delay: el.dataset.index * 0.15,
    onComplete: done
  })
}
  • Bruce Lee
  • Jackie Chan
  • Chuck Norris
  • Jet Li
  • Kung Fury

Référence

TransitionGroupa chargé