Vue 公式チュートリアル 〜 スロットの使い方?

記事
IT・テクノロジー

Vue 公式チュートリアル 〜 スロットの使い方?

Vue の公式チュートリアルを使った、Web 開発の学習例もステップ14まで来ました。このチュートリアルはこれで基本的に最後です。ステップ14では、スロットの使い方を学習します!


前回までのポイントはポイントは?

これまでの学習をまとめると大きく分けて二つです。

* 基本的な Vue の部品の記述方法
* Vue の部品の基本的な使用方法
です。基本的な Vue の基本的な記述方法は、メインのページでも、呼び出される側の「部品」でも同じでした。 基本は、HTML の部分で表示の基本的な構成を作って、Javascript で表示に使うデータを管理・処理します。これに加えて、CSS で表示の「飾り」をするという構成です。

これをベースに、HTML、Javascript、CSS の連携のやり方に加えて、部品を呼び出す方(親)と呼び出される部品側(子)の間でのデータのやり取りのやり方を学んできました。

これまでの、13 のステップで基本的な書き方をカバーして来ました。

こうした基本を改めて振り返っって見てください。

今回学ぶのは?

今回学ぶのは、「スロット」の使い方です。 「スロット」を使うと、部品の呼び出し元(親)から、「部品」(子)にデータを渡す事ができます。

まずは、変更前のコードを見てみます。

(App.vue)
<script>
import ChildComp from "./ChildComp.vue";

export default {
  components: {
    ChildComp,
  },
  data() {
    return {
      msg: "from parent",
    };
  },
};
</script>

<template>
  <ChildComp></ChildComp>
</template>
この記述自体は、まだ特別な部分はありません。 普通に、部品「ChildComp」を呼び出しているだけです。 Javascript の部分で、「msg」という変数を作って、「'from parent'」というデータを設定していますが、このデータは特に使っていない状態になっています。

続いて「部品」の方の記述です。

(ChildComp.vue)
<template>
  <slot>Fallback content</slot>
</template>
「slot」というタグが使われている以外は特に新しい部分はありません。 このコードを実行すると、「Fallback content」が表示されます。

今回の課題は、部品の呼び出し元のデータ「msg」を「部品」に渡して、「from parent」を表示できるようにするのが目的です。

変更後のコードは?

では、変更後のコードを、見てみます。

まずは、部品を呼び出す側のコードです。

(App.vue)
<script>
import ChildComp from "./ChildComp.vue";

export default {
  components: {
    ChildComp,
  },
  data() {
    return {
      msg: "from parent",
    };
  },
};
</script>

<template>
  <ChildComp>Message: {{ msg }}</ChildComp>
</template>
変更したのは一箇所だけです。

<ChildComp>Message: {{ msg }}</ChildComp>
「部品」のタグで、「Message: {{ msg }}」を囲んでいるだけです。 このタグで囲まれた部分が「スロット」と呼ばれる部分になって、この部分全体が「部品」に渡されます。

「部品側(子)」のコードには変更はありません。

(ChildComp.vue)
<template>
  <slot>Fallback content</slot>
</template>
要は、「slot」のタグで囲まれた部分に、呼び出し元(親)が指定したデータが埋め込まれて表示されるという仕組みです。部品側で最初に書いたデータ「Fallback content」は、上書きされるという仕組みです。

今回の応用は?

実は、私自身も、このチュートリアルをやってみるまで「スロット」を使ったデータの渡し方は知りませんでした!つまり、別の方法でも同じような事が実現できるので、特にこの機能を知らなくても問題はなかったという事です。

同じような記述を、これまでに学習した「props」を使っても実現できます。

ここでは、「スロット」を使わずに同じような機能を実現してみてください。

実装例です

<script>
import ChildComp from "./ChildComp.vue";

export default {
  components: {
    ChildComp,
  },
  data() {
    return {
      msg: "from parent",
    };
  },
};
</script>

<template>
  <ChildComp :msg="msg" />
</template>
基本は同じです。 データは、「props」を使って渡しています。

<ChildComp :msg="msg" />
「部品側」の記述例です。 「props」を受け取る準備が必要です。「props」が渡されない場合には、「Fallback contents」を表示するようになっているのは、今回の公式チュートリアルのステップ14と同じです。

<script>
export default {
  props: { msg: String },
};
</script>
<template>
{{ msg ? msg : "Fallback contents" }}
</template>
「部品」の記述を比べてみると、「スロット」を使った方がシンプルに書くことができる事がわかります。 ただし、同じような機能は、これまでに学習した「props」を使っても記述できることもお分かりかと思います。

まとめ
Vue の公式チュートリアルは、今回のステップ14で一通りの学習は終了です。 今回学習した、「スロット」を使う方法は、便利な方法ですが、応用例で紹介した通り、この方法を知らなくても、これまでに学習した「props」を使えば実現できる事もわかりました。

Web 開発をする上で一番重要な事は、「必要な機能を実現する事」です。逆に言うと、全ての項目を理解する事は一番重要ではないと言う事です。よく利用する方法で代用が可能ならば、今回のような「スロット」の使い方は知らなくても、同じ機能が実装できます。実際に、私自身も、今回このチュートリアルを実際にやってみるまでは、存在自体を知りませんでした。それでも、実際の Web 開発で困ったことはありませんでした。

今回の学習方法のポイントは、「必要な事を優先して学ぶ」でした。

実際の開発では、まずよく使う項目を使えるようになることが最重要課題です。

そう考えると、この学習方法は初心者にはメリットがある方法だと言えます。

次回は、公式チュートリアルに加えて学習しておくと良い事を紹介する予定です。2022 年 3 月 16 日にお届け予定です。お楽しみに!
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す