いままでのコンポーネントについての記事はこちら↓
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”