【Vue.js】slotを使ったコンポーネント間のデータ受け渡し

いままでのコンポーネントについての記事はこちら↓

スポンサーリンク

htmlタグを含めて子にデータを送る時

親テンプレート上で、子コンポーネントのタグ内に送りたいHTMLを記載する。
{{}}も使用可能。

<CountHeader>
  <h1>カウント</h1>
  <p>{{ number }}</p>
</CountHeader>

子テンプレート上では、受け取りたい箇所に<slot>を記載する。

<template>
  <div>
    <slot></slot>
  </div>
</template>

Styleをかけたい場合、親でもslotを呼び出した子でもどちらのコンポーネント上でCSSを書いても適用される。
親、子どちらにも記載した場合、親に書いたCSSが適用される。

フォールバックコンテンツ

slotタグ内にデフォルト表示のコンテンツを入れる事で、slotが空の時にデフォルト表示がされるようになる。

<template>
  <div>
    <slot><p>中身がありません。</p></slot>
  </div>
</template>

複数のslotを使用する

<template>v-slot:を使って、識別する名前を付ける。
受け渡しをしたい値をそれぞれ<template>タグで囲む。
ここでは必ず<template>タグを使用する。

templateタグ内にv-slot:を設ける。v-slot:の後に来る文字列は連携するための名前を記載。

<CountHeader>
  <template v-slot:title>
     <h1>カウント</h1>
  </template>
  <template v-slot:number>
      <p>{{ number }}</p>
  </template>
</CountHeader>

子コンポーネント側では、それぞれのslotに受け取りたいデータ(template)に付けた名前を付与して呼び出す。

呼び出しは、<slot>タグ内にname=”呼び出したい名前”を設定する。

<template>
  <div>
    <!-- タイトルを表示 -->
    <slot name="title"></slot>

    <!-- 数字を表示 -->
    <slot name="number"></slot>
  </div>
</template>

<template>以外で記述した内容は、デフォルトslotとなる。
templateで名前を付与していないデータに対して、Vueが自動的にtemplateで囲ったうえで、v-slot:defaultを命名している。
子コンポーネント上にある<slot>にも自動的にname=”default”をつけている。

<template v-slot:title>
   <h1>カウント</h1>
</template>

<!-- デフォルト -->
<h1>デフォルトスロット</h1>
<!-- タイトルを表示 -->
<slot name="title"></slot>

<!-- デフォルト -->
<slot></slot>

slotを使って子データにアクセスする

子コンポーネントに下記のようなデータがあると仮定します。

<script>
export default {
  data(){
      return {
          user:{
              name:'Mory',
              age:38
          },
      }
  }
};
</script>

このデータを親がアクセスするには、子で定義しているslotにv-bindで受け渡すデータを定義する。

<slot name="title" :user="user"></slot>

親側では、template内に記載しているv-slot:[名前]に「=」を繋げて子データにアクセスできるように名前を付与する。

<template v-slot:title="slotProps">
</template>

子データにアクセスする時は、
{{v-slotで定義した名前.オブジェクト名.アクセスしたい値}}
で呼び出す事ができる。それぞれドットで繋げる。

<template v-slot:title="slotProps">
   <h2>Hello!{{slotProps.user.name}}</h2>
</template>

デフォルトslotしかない場合は、templateを使わなくてもコンポーネント名のタグ内に記述することができる。
v-slot:の名前はデフォルトの場合、自動付与されるため、「:default」も省略可能。

<CountHeader v-slot="slotProps">

動的slot

動的なslotは[](カッコ)で指定ができる。

<!-- template上 -->
<template  v-slot:[title]="slotProps">

<!-- dataでv-slotの名前を指定する -->
data() {
    return {
      title:"title"
    };
}

v-slotを省略して書く

v-slotは「(シャープ)に置き換えることができる。

v-slot:number  → #number

v-slot:[title]  → # [title]

デフォルトslotの場合は、「default」を明示的にする。

v-slot= “slotProps”  → #default= “slotProps”

タイトルとURLをコピーしました