【Nuxt,js】slotで共通コンポーネントを作る

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

【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にデプロイしています。
よかったら覗いててみてください。

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