時給単価UP【3大特典付き】
コーディングテクニック集100選⋙

【解説】Vue.jsのTransitionGroupの使い方【注意点】

記事内に広告を含みます

パソ君
パソ君

・Vue.jsでTransitionGroupはどう使うの?

こんな疑問にお答えします。

「Transition」は直下にある1つの要素でしか使えませんよね。

ただ場合によっては、v-forでループした複数のタグに対して使用したい時があるかと。

そんなときに便利なのが「TransitionGroup」です。

「TransitionGroup」を使えば、ループで複製された複数タグに対して活用可能です。

ジト
ジト

便利だね!

ということで、この記事では「Vue.jsのTransitionGroupの使い方」について解説していきます!

この記事でわかること

Vue.jsのTransitionGroupの使い方

【解説】Vue.jsのTransitionGroupの使い方

そんな「TransitionGroup」を使った例がこちら↓

See the Pen vue TransitionGroup① by jito-coder (@jito-coder) on CodePen.

ボタンをクリックするたび、、配列最初の1個目が透過しつつ非表示になりますよね。

複数タグでも実装できてるのがわかるかと。

<script setup lang="ts">
import { ref } from 'vue';

const fruits = ref(['りんご', 'もも', 'みかん', 'ぶどう']);
const removeLastFruit = () => {
  if (fruits.value.length > 0) {
    fruits.value.shift();
  }
};
</script>
<template>
  <TransitionGroup tag="ul">
    <li v-for="fruit in fruits" key="fruit" >
      {{ fruit }}
    </li>
  </TransitionGroup>
  <button v-on:click="removeLastFruit">配列1個めを消す</button>
</template>
<style scoped>
.v-enter-from {
  opacity: 0;
}
.v-enter-active {
  transition: opacity .5s;
}
.v-enter-to {
  opacity: 1;
}

.v-leave-from {
  opacity: 1;
}
.v-leave-active {
  transition: opacity .5s;
  position: absolute;
}
.v-leave-to {
  opacity: 0;
}

.v-move {
  transition: all 1s;
}
</style>

主な使い方がこちら↓

①:「TransitionGroup」で囲む

②:複数要素を記述

③:「tag」を使って囲むタグを指定

④:付与クラスに対してCSSを記述

⑤:「v-move」に対してCSSを記述

順に解説してきます。

➀: 「TransitionGroup」で囲む

まず「TransitionGroup」というコンポーネントのタグで囲みましょう。

<TransitionGroup>

</TransitionGroup>

➁:複数要素を記述

続いて中に実装したい要素を入れていきます。

今回は例として複数要素で出力するようv-forを記述しました。

<TransitionGroup>
  <li v-for="fruit in fruits" key="fruit" >
    {{ fruit }}
  </li>
</TransitionGroup>

v-forの使い方を知りたい方は下記をどうぞ。

【解説】Vue.jsの「v-for」の使い方【key属性に注意】

➂:「tag」を使って囲むタグを指定

次に必須ではありませんが「tag」を記述します。

この「tag」を使うと、その値が大枠のタグになってくれるんですよね。

今回は例として「tag=”ul”」と指定しました。

<TransitionGroup tag="ul">
  <li v-for="fruit in fruits" key="fruit" >
    {{ fruit }}
  </li>
</TransitionGroup>

すると「ulタグ」で囲われるよう出力されます。

ちなみに何も設定してないと、タグが何も囲われません。

④:付与クラスに対してCSSを記述

そしたらTransitionの時と同様に、付与されるクラスにCSSを当てていきます。

透過アニメーションを実装したいなら下記の感じ↓

<style scoped>
.v-enter-from {
  opacity: 0;
}
.v-enter-active {
  transition: opacity .5s;
}
.v-enter-to {
  opacity: 1;
}

.v-leave-from {
  opacity: 1;
}
.v-leave-active {
  transition: opacity .5s;
}
.v-leave-to {
  opacity: 0;
}
</style>

付与されるクラス等は下記記事にて解説しておりますので、気になる方はどうぞ。

【解説】Vue.jsのTransitionの使い方【クラス名変更/初回描画時】

⑤:「v-move」に対してCSSを記述

TransitionGroupでは新たに「v-move」というクラスが付与されます。

このクラスは削除・追加された要素ではない、他の周りの要素に対して付与されるのが特徴です。

デフォルトのままだと、削除・追加された要素以外の要素は、カクカク動いてしまいます。

これを解消するために「v-move」に対してtransitionを指定してあげましょう。

下記のように「v-move」に対して「transition: all 1s;」のように指定すると、周りの要素がスムーズに動くようになります。

<style scoped>
~~

.v-move {
  transition: all 1s;
}

~~
</style>

また要素が削除されると、他要素は即座に位置が変わります。デフォルトのままだとカクカクしてしまう。

これを改善するために「v-leave-active」に対して「position: absolute;」をつけてあげましょう。

.v-leave-active {
  transition: opacity .5s;
  position: absolute;
}

これで即座に再配置されないため、スムーズに動いてくれます。

【解説】Vue.jsのTransitionGroupを使う時の注意点

「TransitionGroup」を使うときは、いくつか注意点があります。

それがこちら。

①:key属性が必要

②:modeは使用できない

順に解説してきます。

➀:key属性が必要

「TransitionGroup」を使うときは、直下の要素にkey属性が必要です。

そのため「key=””」を記述しておきましょう。

ちなみにv-ifを使うときは、内部的にkey属性が使われているらしいのでそのままでOK。

➁:modeは使用できない

「mode=”out-in”」や「mode=”in-out”」が使えないのが注意点です。

TransitionGroupは複数要素で実装できますからね。

そのため使用しないようにしましょう。

【解説】Vue.jsのTransitionGroupの使い方【注意点】:まとめ

  • 「TransitionGroup」を使えば複数要素で使える
  • 「tag」を使えば囲むタグの指定可能
  • 削除・追加要素の周りの要素に「v-move」がつく
  • 直下の要素にはkey属性をつけておく
  • mode=””は使えない
ジト
ジト

TransitionGroupを使う時はためしてみてね!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA