【Vue.js】タブ切り替え

Image

Vue.jsで実装するタブ切り替えになります!本記事では動的に切り替える方法と、表示・非表示を切り替える方法をご紹介しています。

共通のスクリプト

HTML部分はそれぞれ微妙に異なりますが、スクリプトは共通のものを使用します。

Vue.js

最初にVue.jsを読み込みこんでおきます。これがないと始まりませんね!

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>

JS

続いて下記のスクリプトを追記します。Vue.jsでタブ切り替えを実装する方法はいくつかあるかと思いますが、本記事では下記のスクリプトを使用しています。

new Vue({
  el: '#tab',
  data: {
    isActive: '1'
  },
  methods: {
    isSelect: function(num) {
      this.isActive = num;
    }
  }
})

タブコンテンツを動的に切り替える

v-if、v-else-ifでコンテンツを動的に切り替えます。選択中のタブに紐づくコンテンツのみが表示され、それ以外のコンテンツのDOMは生成されません。

HTML

<div id="tab">
  <ul class="tabMenu">
    <li @click="isSelect('1')">All</li>
    <li @click="isSelect('2')">News</li>
    <li @click="isSelect('3')">Event</li>
  </ul>
  <div class="tabContents">
    <div v-if="isActive === '1'">Tab All</div>
    <div v-else-if="isActive === '2'">Tab News</div>
    <div v-else-if="isActive === '3'">Tab Event</div>
  </div>
</div>

DEMO

See the Pen Vue.js | Tab 1 by ryoy (@intotheprogram) on CodePen.

タブコンテンツの表示・非表示を切り替える

こちらはコンテンツの表示・非表示を切り替える方法になります。選択中のタブコンテンツはdisplay:blockとなり、他はnoneの状態となります。

<div id="tab">
  <ul class="tabMenu">
    <li @click="isSelect('1')">All</li>
    <li @click="isSelect('2')">News</li>
    <li @click="isSelect('3')">Event</li>
  </ul>
  <div class="tabContents">
    <div v-show="isActive === '1'">Tab All</div>
    <div v-show="isActive === '2'">Tab News</div>
    <div v-show="isActive === '3'">Tab Event</div>
  </div>
</div>

DEMO

See the Pen Vue.js | Tab 2 by ryoy (@intotheprogram) on CodePen.

選択されたタブにactiveのclassを付ける

こちらは選択中のタブにactiveのclassをつける処理を追加したものになります。選択中のタブがわかりやすいようにスタイルを付けることが多いため、activeのclassをつけられるかは重要ですね!

<div id="tab">
  <ul class="tabMenu">
    <li @click="isSelect('1')" v-bind:class="{'active': isActive === '1'}">All</li>
    <li @click="isSelect('2')" v-bind:class="{'active': isActive === '2'}">News</li>
    <li @click="isSelect('3')" v-bind:class="{'active': isActive === '3'}">Event</li>
  </ul>
  <div class="tabContents">
    <div v-if="isActive === '1'">Tab All</div>
    <div v-else-if="isActive === '2'">Tab News</div>
    <div v-else-if="isActive === '3'">Tab Event</div>
  </div>
</div>

DEMO

See the Pen Vue.js | Tab 3 by ryoy (@intotheprogram) on CodePen.

コンポーネントを使ったタブ切り替え

コンポーネントを使ったタブ切り替えの方法です。

JS

Vue.component('tab-all', {
  template: '<div>All Contents</div>'
})

Vue.component('tab-news', {
  template: '<div>News Contents</div>'
})

Vue.component('tab-event', {
  template: '<div>Event Contents</div>'
})

new Vue({
  el: '#tab',
  data: {
    activeTab: 'All',
    tabs: ['All','News','Event']
  },
  computed: {
    selectTab: function () {
      return 'tab-' + this.activeTab.toLowerCase()
    }
  }
})

HTML

<div id="tab">
  <ul class="tabMenu">
    <li v-for="tab in tabs"
        v-bind:key="tab"
        v-bind:class="{ 'active': tab === activeTab }"
        v-on:click="activeTab = tab">
      {{ tab }}
    </li>
  </ul>
  <component class="tabContents" v-bind:is="selectTab"></component>
</div>

DEMO

See the Pen Vue.js | Tab 4 by ryoy (@intotheprogram) on CodePen.

コンポーネントを使ったタブ切り替えに関しては、公式サイトで紹介されていますので下記のリンク先をご参照いただければと思います。

https://jp.vuejs.org/v2/guide/components.html

以上、Vue.jsで実装するタブ切り替えのご紹介でした!