Vueで再帰的コンポーネントを作成する方法【Vue3】

目次
はじめに
この記事ではVue.jsで再帰的コンポーネントの作成方法を解説します。
再帰的コンポーネントとは、あるコンポーネントが自身を呼び出しているようなコンポーネントを指します。
例えば、ディレクトリ構造やスレッド形式のコメント欄等をコンポーネント化する際に使うことが考えられます。
今回は、ディレクトリ構造を表現するコンポーネントを作成してみます。
再帰的コンポーネントの基本
Vue.jsで再帰的コンポーネントを作成するのは簡単です。
コンポーネントはデフォルトで自身を呼び出すことができます。
例えば、FooBar.vue というファイル名のコンポーネントは、そのテンプレート内で <FooBar/> として呼び出せます。
自身を呼び出すだけではコンポーネントが無限に描画されていくので、あとは描画の条件をv-ifなどを利用して制御します。
ディレクトリ構造を再帰的コンポーネントで再現する
再帰的コンポーネントの例として、ディレクトリ構造を表現するコンポーネントを作成します。
コンポーネントの見た目は以下のようになります。

今回作成するコンポーネント
ディレクトリ構造を再現する再帰的コンポーネントDirectoryTree.vueは、以下のように作成しました。
(CSSは一部省略)
<script setup lang="ts">
interface Props {
type: string;
name: string;
children?: Array<any>;
}
const props = withDefaults(defineProps<Props>(), {
type: "",
name: "",
children: () => [],
});
</script>
<template>
<template v-if="props.type === 'directory'">
<li>
<span class="directory">{{ props.name }}</span>
<ul>
<div v-for="child in props.children">
<DirectoryTree
:type="child.type"
:name="child.name"
:children="child.children"
></DirectoryTree>
</div>
</ul>
</li>
</template>
<template v-else>
<li>
<span class="file">
{{ props.name }}
</span>
</li>
</template>
</template>
propsのtypeがdirectoryのときはディレクトリのため再度、自身のコンポーネント名であるpropsのtypeがdirectoryのときはファイルのため、ファイル名のみを描画しています。
このコンポーネントを呼び出す親コンポーネントApp.vueは、以下のように作成しました。
<script setup lang="ts">
import { ref } from "vue";
import DirectoryTree from "./DirectoryTree.vue";
const tree = ref([
{
type: "directory",
name: "Dir1",
children: [
{
type: "file",
name: "File1",
},
{
type: "directory",
name: "Dir2",
children: [
{
type: "file",
name: "File2",
},
{
type: "directory",
name: "Dir3",
children: [
{
type: "file",
name: "File3",
},
{
type: "file",
name: "File4",
},
],
},
],
},
],
},
{
type: "file",
name: "File5",
},
]);
</script>
<template>
<DirectoryTree :type="'directory'" :name="'/'" :children="tree"></DirectoryTree>
</template>
ディレクトリ構造を持つリアクティブな変数をtreeとして定義します。
DirectoryTreeにtreeを受け渡すことで、ディレクトリ構造を描画することができます。
上記のコードは以下のプレイグラウンドで確認することができます。
まとめ
今回は再帰的コンポーネントの作成方法を解説しました。
Vue.jsではあるコンポーネント内で自身を呼び出すことができるため、簡単に再帰的コンポーネントを作成することができます。
既に誰かがまとめていると思ったのですが、Vue3かつ<script setup>構文で書かれた例がまだなかったためまとめてみました。
参考になれば幸いです。
参考
- Vue.js公式 再帰的コンポーネント
関連記事

AWS IAMでPasskeyが利用可能に Windows PCで指紋認証を設定してみました

React公式チュートリアルをVueでも書いて比較してみた

Vueのスコープ付きCSSで子コンポーネントにCSSを適用する【Vue3】

Vercel(Hobby)→AWS Amplify 移行して分かった両者の違い

手軽に使えるVueプレイグラウンド環境。Vue SFC Playground解説

Vite、TailwindCSS v4環境を構築【Tailwind CSS v4-alpha】
オススメ記事

React公式チュートリアルをVueでも書いて比較してみた

フロントエンド開発体験を向上させる10のnpmライブラリ【2024年版】

VueのdefineModelを活用した入力コンポーネントの作成方法【Vue3.4】

Nuxt3にStorybookを導入する方法

NuxtJSを使ってブログを作ってみた【Nuxt Content/TailwindCSS/daisyUI】

