大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【Vue】slot

はじめに

こんにちは!大ちゃんの駆け出し技術ブログです。

今月は主なアウトプットとしてvueを題材にしたものを書きます

大体が短いアウトプットで終わると思うので、いつもみたいな長い記事ではないかなと思います。

基本的な用途

本記事ではslotについて紹介します。

slotはかなり特徴的な書き方をするのかなと個人的に思っております。

slotの機能ですが一言で言うと

「親コンポーネント側で指定した値を挟み込む」

となります!

まずは簡単なコードを見ていきましょう。

最初にコンポーネントの作成ファイルを見ていきます

slotを使用したコードサンプルが以下のようになります。

// slot/js/slot.js
Vue.component("slot-practice", {
  template: `<div>start:   [<slot></slot>]   :finish</div>`,
});

new Vue({
  el: "#app",
});

slot-practiceというコンポーネントを作成しています。

templateの中は極めてシンプルな作りでdivタグの中に今回の題材であるslotタグがあるだけです。「start: [」、「] :finish」はただの文字列です。この後説明する挟み込まれていることをわかりやすくするために書いています。

htmlコードは以下のようになります。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title>slot-practice</title>
  </head>
  <body>
    <div id="app">
      <slot-practice></slot-practice> <!-- 注目 -->
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
    <script src="js/slot.js"></script>
  </body>
</html>

コンポーネントを配置しただけとい感じですね。

ここで実際に表示される画面をブラウザ上で確認します。

https://i.gyazo.com/c01adc7b1451e175c233b73e43bd88ae.png

特に何も起こっていませんね。

では冒頭で述べたslotの要約を思い出して実装します。

コンポーネント側で指定した値を挟み込む」

コンポーネントのタグの間で挟み込みたい文字を記述します。どんな文字でもOKです!

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title>slot-practice</title>
  </head>
  <body>
    <div id="app">
      <slot-practice>挟まれた!</slot-practice>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
    <script src="js/slot.js"></script>
  </body>
</html>

もう一度ブラウザで確認しましょう。

https://i.gyazo.com/b54288152a36a12f64eff08abf3266f5.png

まさに親コンポーネントで指定した値が挟み込まれたといった感じです。

このように、コンポーネントのタグの間で記述した文字を子コンポーネントのslotタグの箇所に表示することがslotの機能です。

つまり、

<slot-practice>挟まれた!</slot-practice>

<div>start:   [<slot></slot>]   :finish</div><div>start:   [挟まれた!]   :finish</div>

このようにして<slot></slot>の箇所が置換されるのです!

名前付きスロット

少し発展して名前付きスロットという物も紹介しておきます。

挟み込みたい文字が複数あった場合とかに使用できます。

上述したコンポーネントのtemplateの中で複数箇所に挟み込みたい文字があったとします。

例えばheaderタグを用意してみます。

Vue.component("slot-practice", {
  template: `<div>
    <header>
      <slot></slot>
    </header>
    <div>start:   [<slot></slot>]   :finish</div>
  </div>`,
});

new Vue({
  el: "#app",
});

先ほどと同じhtmlファイルのままでブラウザを確認します。

https://i.gyazo.com/99c8f3abb7c1d7848d9f5779eb2f2827.png

2つのslotタグが両方とも同じ文字で挟み込まれました。

ここまでは先ほどのおさらいですね。

ここで、headerタグの中にあるslotと先ほどのdivタグの中のslotには違う文字を入れたいとします。

しかし、この時親コンポーネントからは複数の値を指定することができません。

その場合に使う機能が名前付きスロットです。

JSファイルに名前付きスロットを導入します。

Vue.component("slot-practice", {
  template: `<div>
    <header>
      <slot name="header"></slot>
    </header>
    <div>start:   [<slot name="middle"></slot>]   :finish</div>
  </div>`,
});

new Vue({
  el: "#app",
});

slotタグにname属性を付け加えているといった感じですね。

コンポーネント側では記述方法を少し変えます。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title>slot-practice</title>
  </head>
  <body>
    <div id="app">
      <slot-practice>
        <template v-slot:header>
          ヘッダーを挟み込む
        </template>
        <template v-slot:middle>
          ミドルを挟み込む
        </template>
      </slot-practice>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
    <script src="js/slot.js"></script>
  </body>
</html>

slot-practiceコンポーネントの中にtemplateタグを2度使用しています。そして、タグにはv-slot:<コンポーネントのslotのname属性>を指定しています。

<slot-practice>
  <template v-slot:header>
    ヘッダーを挟み込む
  </template>
  <template v-slot:middle>
    ミドルを挟み込む
  </template>
</slot-practice>

これにより、v-slotで指定したname属性を持つslotの場所に挟み込みたい文字が表示されます。

表示される画面は以下のとおりです。

https://i.gyazo.com/37b5d03d7c3fe49f64a20550add09a69.png

以上のようにtemplateタグを同一コンポーネント内で分けて使用し、name属性を明示することで、表示させたいslotタグの箇所に意図した文字を挟み込むことが可能となります!

終わりに

slotはよく使われるとRUNTEQで教えられてたので上手に使えるようにしておきたいですね。

こんな感じで今月は短いアウトプットを多めにしようかなと思いますのでよろしくお願いいたします。

以上、大ちゃんの駆け出し技術ブログでした!