Przejdź bezpośrednio do treści

TransitionGroup

<TransitionGroup> jest wbudowanym komponentem zaprojektowanym do animowania wstawiania, usuwania oraz zmiany kolejności elementów lub komponentów renderowanych w liście.

Różnice w porównaniu z <Transition>

<TransitionGroup> obsługuje te same właściwości, klasy przejść CSS i nasłuchiwacze zdarzeń JavaScript co <Transition>, z następującymi różnicami:

  • Domyślnie nie renderuje elementu opakowującego. Możesz jednak określić element do wyrenderowania za pomocą właściwości tag.

  • Tryby przejścia nie są dostępne, ponieważ nie przełączamy się już między wzajemnie wykluczającymi się elementami.

  • Elementy wewnętrzne zawsze muszą posiadać unikalny atrybut key.

  • Klasy przejść CSS będą stosowane do poszczególnych elementów na liście, a nie do grupy/kontenera.

TIP

Podczas używania w szablonach w-DOM, komponent powinien być przywoływany jako <transition-group>.

Przejścia wejścia / wyjścia

Oto przykład zastosowania przejść wejścia/wyjścia do listy v-for przy użyciu <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

Przejścia ruchu

Powyższa demonstracja ma kilka oczywistych wad: gdy element jest wstawiany lub usuwany, otaczające go elementy natychmiast "przeskakują" na swoje miejsce, zamiast poruszać się płynnie. Możemy to naprawić, dodając kilka dodatkowych reguł CSS:

css
.list-move, /* zastosuj przejście do poruszających się elementów */ .list-enter-active, .list-leave-active {  transition: all 0.5s ease; }  .list-enter-from, .list-leave-to {  opacity: 0;  transform: translateX(30px); }  /* upewnij się, że wychodzące elementy są usuwane z przepływu układu,  aby animacje ruchu mogły być obliczone poprawnie. */ .list-leave-active {  position: absolute; }

Teraz wygląda to znacznie lepiej - nawet animacja jest płynna, gdy cała lista jest przetasowywana:

  • 1
  • 2
  • 3
  • 4
  • 5

Pełny przykład

Własne klasy TransitionGroup

Możesz również wyspecyfikować własne klasy przejść dla elementów przekazując prop moveClass do <TransitionGroup>, tak samo jak własne klasy przejść na <Transition>.

Rozłożone w czasie przejścia listy

Poprzez komunikację z przejściami JavaScript za pomocą atrybutów danych, możliwe jest również rozłożenie w czasie przejść na liście. Najpierw renderujemy indeks elementu jako atrybut data na elemencie 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>

Następnie, w hookach JavaScript, animujemy element z opóźnieniem bazującym na atrybucie data. Ten przykład wykorzystuje bibliotekę GSAP do wykonania animacji:

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

Powiązane

TransitionGroupJest załadowany