Vue.jsで再利用可能なアコーディオンのコンポーネントを実装する方法を解説
Post on:2021年11月9日
アコーディオンは、Webサイトやスマホアプリでよく使用されるUIコンポーネントです。TailwindCSSやBootstrapなどのライブラリにも必ずありますが、再利用可能な柔軟性のあるものではありません。
スタイルを簡単にカスタマイズできる再利用可能なアコーディオンのコンポーネントをVue.jsで実装する方法を紹介します。
How to Build an Accordion Component in Vue.js
by by Luca Spezzano
はじめに
Vue.jsのコンポーネントに関するHow to記事は今回で4回目となりますが、最もよく読まれているのはチュートリアル記事で、具体的に使用できるものをすぐに実装することができるだと思います。
- Vue.jsで再利用可能なタブのUIコンポーネントを実装する方法を解説
- Vue.jsでSlotsの代わりにPropsを使用する理由、名前付きSlotsやスコープ付きSlotsとの違いについて解説
- IntersectionObserverを使用すると実装が簡単に!Vue.jsでスクロールイベントをトリガーする方法
この記事では、私がプロジェクトで最もよく使用するコンポーネントの1つ、アコーディオンを解説することにしました。
アコーディオンのコンポーネントは非常に便利で、Bootstrapなど多くのライブラリにも使用されています。
さっそく実装してみましょう!
アコーディオンの実装
このチュートリアルでは、アコーディオンの機能に必要なもの以外のスタイルは使用しません。さまざまなプロジェクトで簡単に利用できるように、非常にシンプルなデザインです。
基本的なスタイルにはTailwind CSSを使用していますが、お好みのCSSを自由に使用してください。デモは、下記ページからご覧ください。
ではコードを解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<template> <div> <button @click="toggleAccordion()" class="flex items-center space-x-3"> <slot name="title" /> <svg class="w-3 transition-all duration-200 transform" :class="{ 'rotate-180': isOpen, 'rotate-0': !isOpen, }" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 10" > <path d="M15 1.2l-7 7-7-7" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /> </svg> </button> <div class="transition-all duration-400 overflow-hidden" :class="{ 'max-h-96': isOpen, 'max-h-0': !isOpen, }" > <slot name="content" /> </div> </div> </template> <script> export default { data() { return { isOpen: false, }; }, methods: { toggleAccordion() { this.isOpen = !this.isOpen; }, }, }; </script> |
上記のコードを解説します。
データとメソッド
data isActive
の値を変更するmethod
を使用しています。この値に基づいてCSSのクラスを動的に追加または削除して、コンポーネントにコンテンツを表示または非表示にすることができます。
名前付きSlots
もう一つの注意点はnamed slots
を使用してコンテンツをコンポーネントに追加する方法です。これによりHTMLを含むあらゆるタイプのコンテンツを追加することができ、柔軟性があります。
named slots(名前付きSlots)の詳細については、下記をご覧ください
The Difference Between Props, Slots and Scoped Slots in Vue.js
翻訳版: Vue.jsでSlotsの代わりにPropsを使用する理由、名前付きSlotsやスコープ付きSlotsとの違いについて解説
アコーディオンのコンポーネントの使用方法
1 2 3 4 5 6 7 8 |
<app-accordion class="mb-4"> <template v-slot:title> <span class="font-semibold text-xl">Accordion 1</span> </template> <template v-slot:content> <p><b>Lorem</b>, ipsum dolor sit amet consectetur adipisicing elit. Quia, porro. Non a excepturi, voluptatibus ipsam magnam, eligendi, accusantium ipsa quae quis praesentium voluptate saepe ullam sint ea itaque consectetur impedit?</p> </template> </app-accordion> |
このコンポーネントを使用するには、上記のようにnamed slots
にコンテンツを挿入してインポートします。再利用は非常に簡単で、title
とcontent
named slots
を使用して好きなコンテンツを追加できるコンポーネントを実装しています。
このコンポーネントは自由にカスタマイズできます。下記のデモページで、お好みに合わせてカスタマイズしてみてください。
終わりに
多くのライブラリでアコーディオンをはじめ、その他のシンプルなコンポーネントを実装できます。しかし、シンプルなコンポーネントを実装するためだけにライブラリは必要ですか?
ライブラリを使用すると柔軟性に欠け、実装コードのサイズが大きくなってしまいます。アコーディオン、モーダル、タブ、ドロップダウンなどのコンポーネントを一から作るのが、プロジェクトにとって最適の方法です。
sponsors