yuheijotaki.com

【学習メモ】基礎から学ぶ Vue.js その4

  • 第 6 章 トランジションとアニメーション

基本的なトランジションの使い方

<div id="app">
  <button v-on:click="show=!show">切り替え</button>
  <transition><div v-show="show">トランジションする要素</div></transition>
</div>
.v-enter-active,
.v-leave-active {
  transition: opacity 1s;
}
.v-enter,
.v-leave-to {
  opacity: 0;
}
var app = new Vue({
  el: "#app",
  data: {
    show: true
  }
});

v-show ではなく v-if でも可能

<div id="app">
  <button v-on:click="show=!show">切り替え</button>
  <transition><div v-if="show">トランジションする要素</div></transition>
</div>

プレフィクスの変更

<div id="app">
  <button v-on:click="show=!show">切り替え</button>
  <transition name="hoge">
    <div v-if="show">トランジションする要素</div>
  </transition>
</div>
.hoge-enter-active,
.hoge-leave-active {
  transition: opacity 1s;
}
.hoge-enter,
.hoge-leave-to {
  opacity: 0;
}

初期描画時もアニメーションする appear属性

<div id="app">
  <transition appear>
    <div v-if="show">トランジションする要素</div>
  </transition>
</div>

キーの変化に反応してアニメーションする

<div id="app">
  <button v-on:click="count++">+1する</button>
  <transition mode="out-in">
    <div v-bind:key="count">{{ count }}</div>
  </transition>
</div>
.v-enter-active,
.v-leave-active {
  transition: opacity 1s;
}
.v-enter,
.v-leave-to {
  opacity: 0;
}
var app = new Vue({
  el: "#app",
  data: {
    count: 0
  }
});

リストトランジション

<div id="app">
  <button v-on:click="order=!order">並び替え・変更</button>
  <transition-group tag="ul" class="list">
    <li v-for="item in sortedList" v-bind:key="item.id">
      {{ item.name }} {{ item.price }}円
    </li>
  </transition-group>
</div>
.v-enter-active,
.v-leave-active {
  transition: opacity 1s;
}
.v-enter,
.v-leave-to {
  opacity: 0;
}
.v-move {
  transition: transform 1s;
}
var app = new Vue({
  el: "#app",
  data: {
    order: false,
    list: [
      { id: 1, name: "りんご", price: 100 },
      { id: 2, name: "ばなな", price: 200 },
      { id: 3, name: "いちご", price: 300 }
    ]
  },
  computed: {
    // orderの値でリストの順番を反転する算出プロパティ
    sortedList: function() {
      // LodashのorderByメソッドを使用
      return _.orderBy(this.list, "price", this.order ? "desc" : "asc");
    }
  }
});