前回の記事で使用したダイアログコンポーネントで簡単に説明します。

【Nuxt,js/Vue.js】確認ダイアログコンポーネントで$emitの挙動を学ぶ
結論$emitは子コンポーネントから親コンポーネントにイベントを送るときに使用する実際にNuxt.jsで$emitを使用して確認ダイアログを作成してみる▼親コンポーネントpages/sample/dialog.vueに子であるダイアログコン
▼親テンプレート(dialogコンポーネント:Dialog)
<template lang="pug"> CommonDialog(v-if="active" @onCancelClicked="onCancelClicked") div(slot="header") サンプルダイアログ div(slot="body") p これはサンプルダイアログです。 p 閉じるにはOKボタンを押してください。 </template> <script> import CommonDialog from "@/components/CommonDialog"; export default { name: "SampleDialog", components: { CommonDialog }, props: { active: { type: Boolean, required: false, default() { return false; } } }, methods: { onCancelClicked() { this.$emit("cancelClicked"); } } }; </script>
▼子テンプレート(dialog共通コンポーネント:CommonDialog)
<template lang="pug"> div.dialog div.dialog__overlay div.dialog__card div.dialog__header slot(name="header") div.dialog__body slot(name="body") div.dialog__footer Button.dialog__btn( @click="cancelClicked" ) OK </template> <script> export default { name: "CommonDialog", methods: { cancelClicked() { this.$emit("onCancelClicked"); } } }; </script>
Vue には Web Components spec draft にヒントを得たコンテンツ配信 API が実装されており、 <slot>
要素をコンテンツ配信の受け渡し口として利用しますhttps://jp.vuejs.org/v2/guide/components-slots.html
親テンプレート(Dialog.vue)で、共通コンポーネントのCommonDialogのslot箇所に渡したいコンテンツを記載します。
つまり、Dialog.vueのdiv(slot="header") サンプルダイアログ
は、CommonModal.vueのslot(name="header")
に渡されます。
テンプレートをslotで渡すことも可能です。
ただし、以下には注意してください。
親テンプレート内の全てのものは親のスコープでコンパイルされ、子テンプレート内の全てものは子のスコープでコンパイルされる。 https://jp.vuejs.org/v2/guide/components-slots.html
slotを用いた共通コンポーネントを作成して、開発効率をあげましょう。
参考
githubにコードを、herokuにデプロイしています。
よかったら覗いててみてください。