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

2024/01/29
2024/02/19
サムネイル
※当ブログの記事にはアフィリエイトリンクを使用している場合があります。

はじめに

この記事では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公式 再帰的コンポーネント

この記事をSNSで共有する

関連記事

オススメ記事

このブログを運営している人

アイコン

Webシステムエンジニア / DTMer

あっしゅからー

フリーランスでWebシステムエンジニアをやっています。

趣味ではDTMをしていて、オリジナル曲をニコニコ動画やYouTubeに投稿しています。

Copyright © 2025 あっしゅからー - All right reserved