Vue.jsで親テンプレートから子テンプレートに表示するコンテンツを制御する
Vue.jsでコンポーネントを定義するときに、コンポーネントを使いまわしつつ表示する文言を変えたいってこと結構ありますよね。
例えば
- 同じモーダル用コンポーネントを利用しつつモーダルに表示する文言だけ変える
とは言えJSのから変数として文字列を渡すのもあまりイケてる実装とはいえませんね。
そんなときは
slot要素
そんな時はslotというAPIを利用すると上手い具合にいきます。
下記の実装では、 app内でapp-containerが2つ利用されていますが、各々子コンポーネントの中身をdiv[slot]で設定しているものにしています。
<div id="js-app"> <app> </app> </div>
const layoutTpl = ` <div class="app-layout"> <app-header></app-header> <app-container> <div slot="content1">こんにちは{{place}}</div> <div slot="content2">Try Everything!</div> </app-container> <app-container> <div slot="content1">こんにちは地球</div> <div slot="content2">Let it go!</div> </app-container> </div> `; const headerTpl = ` <header> <p>テストサイトのヘッダー</p> </header> `; const containerTpl = ` <h1>コンテンツですよ</h1> <slot name="content1"></slot> <slot name="content2"></slot> `; Vue.component('app', { template: layoutTpl, data() { return { place: '世界' } } }) Vue.component('app-header', { template: headerTpl }) Vue.component('app-container', { template: containerTpl }) new Vue({ el: "#js-app" });
そもそもslotとは?
Shadow Domを含んだWeb Componentsをあまり追っていなかったのですが、slotと言うのはW3Cのドラフトに載っている仕様のようですね。
ブラウザに実装されている生のAPIを触ってみたく調べてみたところ、実装されているブラウザはおそらくまだないようでした。
まとめ
今までslotを使わずに表示する内容をJSから渡していたのですが、これを利用するとかなり柔軟なコンポーネントを作ることができますね。
参考書籍
- 作者: mio
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2018/05/29
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: 川口和也,喜多啓介,野田陽平,手島拓也,片山真也
- 出版社/メーカー: 技術評論社
- 発売日: 2018/09/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る