Vue.js 3を使ってTableをカスタマイズしていく(transition-groupを設定する)

はじめに

Vue.js 3系を使ってテーブルを色々カスタマイズして行こうと思います。

前回に引き続き、テーブルのデータを追加したり、削除した時に、<transition-group> を使って、アニメーション追加していきます。

関連Vue.js 3を使ってTableをカスタマイズしていく(データの追加・削除)

Vue.js 3系を使ってテーブルを色々カスタマイズして行こうと思います。
前回に引き続き、テーブルのデータを追加したり、削除したりしていきます。

続きを見る

 

【動画サイズ:59KB】

 

環境

この記事は、以下の管理人の検証環境にて記事にしています。

vue.js 3.2.26

 

完成ソースコード

 

HTML

<div id="app" class="container">
  <button class="btn btn-primary my-3" @click="doAdd">追加</button>
  <table class="table table-bordered">
    <thead>
      <tr>
        <th v-for="(label, key) in header" :key="key">{{label}}</th>
        <th></th>
      </tr>
    </thead>
    <tbody is="vue:transition-group" name="list" tag="tbody">
      <tr v-for="(item, index) in items" :key="item.no">
        <td v-for="(label, key) in header" :key="'td'+key+item.no">{{item[key]}}</td>
        <td><button class="btn btn-danger" @click="doRemove(index)">削除</button></td>
      </tr>
    </tbody>
  </table>
</div>

 

Javascript

const App = {
  data() {
    return {
      header: {no:'No', name:'Name', email:'E-Mail'},
      items:[
        {no:1, name:'Daiki', email:'[email protected]'},
        {no:2, name:'Naoki', email:'[email protected]'},
        {no:3, name:'Yuki', email:'[email protected]'},
        {no:4, name:'Aoi', email:'[email protected]'},
        {no:5, name:'Hnako', email:'[email protected]'},
        {no:6, name:'Momo', email:'[email protected]'},
        {no:7, name:'Taro', email:'[email protected]'}, 
        {no:8, name:'Shiori', email:'[email protected]'},
        {no:9, name:'Jiro', email:'[email protected]'},
        {no:10, name:'Sigeru', email:'[email protected]'},
      ],
      maxNo : 11
    }
  },
  methods: {
    doAdd: function(){
      this.items.push({
        no: this.maxNo, 
        name:'Add User '+this.maxNo, 
        email:'[email protected]'
      });
      this.maxNo = this.maxNo + 1;
    },
    doRemove: function(index){
      this.items.splice(index, 1);
    }
  }
}
Vue.createApp(App).mount('#app');

 

CSS

.list-enter-active,
.list-leave-active {
  transition: all 1s ease;
}
.list-enter-from,
.list-leave-to {
  opacity: 0;
  transform: translateX(30px);
}

 

サンプル

今回のソースを実際に触って確認できるようにデモを用意しました。

サンプルはBootstrapを使用しています。

See the Pen
Vue.jsを使ってTableをカスタマイズしていく(データの追加・削除)
by カバの樹 (@kabanoki)
on CodePen.0

 

transition-groupを設定する

 

step
1
<transition-group>を設置する

通常は、transition-group を設定する時は <transition-group> を設置すれば良いのですが、<tbody> に設定する時は少し工夫が必要です。
おそらくブラウザの仕様だと思いますが、<tbody> の代わりに <transition-group> を設置すると、<transition-group> がテーブルから弾かれて、レイアウトがぐちゃぐちゃになってしまいます。これを防ぐために、<tbody> に対して is="vue:transition-group" で transition-group に置き換えをして、tag="tbody" で再度 <tbody> に戻します。

<tbody is="vue:transition-group" name="list" tag="tbody">
...
</tbody>

 

step
2
アニメーションの設定

Step1で name="list" を設定したことで、list-enter-frolist-leave-toのようなClass名が設定されます。name を使わない場合は、 v-* がプレフィックスされます。

.list-enter-active,
.list-leave-active {
  transition: all 1s ease;
}
.list-enter-from,
.list-leave-to {
opacity: 0;
  transform: translateX(30px);
}

 

さいごに

次回は フィルターを使って、データの絞り込みを設定していきます。

 

その他のまとめは下記よりご覧ください。

まとめVue.js 3を使ってTableをカスタマイズしていく(まとめ)

Vue.js 3系を使ってテーブルを色々カスタマイズして行こうと思います。

続きを見る

 

  • この記事を書いた人

カバノキ

印刷会社のWEB部隊に所属してます。 WEB制作に携わってから、もう時期10年になります。 普段の業務では、PHPをメインにサーバーサイドの言語を扱っています。 最近のお気に入りはJavascriptです。 Vue.jsを狂喜乱舞しながら、社内に布教中です。

-vue.js
-,