Vue.js(トランジション)(Laravel使用)


トランジション参考記事トランジションチュートリアルを参考にさせていただき、進めさせていただきます。

◆トランジション

Vue.jsでは、transitionタグで囲んで、cssでちょっと設定するだけで、移動などのcssトランジションを簡単にセットできます。

<style>
    .v-enter-active, .v-leave-active{
        transition: opacity 1s;
    }
    .v-enter, .v-leave-to {
        opacity: 0;
    }
</style>
<body>
    <div id="sample">
        <button @click="click">表示切替</button>
        <transition>
            <h1 v-show="show">
                Hello World!!
            </h1>
        </transition>
    </div>
</body>
<script src=" {{ asset('js/app.js') }} "></script>
<script>
    const vue = new Vue({
        el: '#sample',
        data:{
            show:true
        },
        methods:{
            click(){
                this.show = !this.show;
            }
        }
    })
</script>

.v-enter-active, .v-leave-activeをcssで指定しておりますが、transitionタグで囲んだ範囲のDOMが挿入されるときがenterとなっており、消えるときがleaveとなっております。
enterとleaveそれぞれv-○○・v-○○-to・v-○○-activeがありますが、enterの場合で説明させていただきますと、
・v-enterは、DOMに挿入される前
・v-enter-toは、DOMに挿入された後
・v-enter-activeは、v-enterからv-enter-toまで
leaveはDOMに挿入された後から、削除されるまでで考えてほしい。
今回でいうと、v-enter-active, .v-leave-activeはDOMに挿入される前からされた後までを1秒かけて、透過度を変化させるためであり、.v-enter, .v-leave-toはDOMに挿入される前とDOMから削除された後は、透過度0と指定してます。
v-で始まるのはデフォルトがそうなっているためであって、transitionタグにname属性をつけることで変更できます。

◆複数グループ化

transitionタグでは、独立したノードという決まりなのでv-forなどを使うときに困ります。そんな時はtransion-groupタグを使用して、解決できます。それでは、表示されている配列をシャッフルするときにアニメーションを働かしてみます。

<style>
    .fruits-list-move {
        transition: transform 1s;
    }
</style>
<body>
    <div id="sample">
        <button @click="shuffle">シャッフル</button>
        <transition-group name="fruits-list">
            <li v-for="(fruit, index) in fruitsList" :key="fruit">
                @{{ fruit }}
            </li>
        </transition-group>
    </div>
</body>
<script src=" {{ asset('js/app.js') }} "></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.1/lodash.min.js"></script>
<script>
    const vue = new Vue({
        el: '#sample',
        data:{
            fruitsList: ['りんご', 'みかん', 'めろん', 'ぶどう']
        },
        methods:{
            shuffle(){
                this.fruitsList = _.shuffle(this.fruitsList);
            }
        }
    })
</script>

key属性を持つことは必須なのですが、indexを指定するとタイムラグの関係かアニメーションがうまくいきませんのでfruitsを設定させていただきました。今回は_.shuffleを使いたいため、CDNでlodash(便利関数の詰まったライブラリ)を利用させていただきます。
nameでtransition-groupを指定しましたので、それをcssで指定しています。今回使用しているのはv-move(アイテムの位置が変更されたときに働いてくれる)を使用しました。

◆トランジションフック

transionタグにイベントフックを仕込むことで、cssのアニメーションと連動できる
参考記事