Vueの共通部品作るときの開設ページは、
2,3種類やり方が、提示されているけど、
一番、自分にしっくりくる、やり方の、指針を書いてみます。
https://jp.vuejs.org/v2/guide/components-slots.html
https://jp.vuejs.org/v2/guide/components-custom-events.html
この記事を書いているのは、2019/08/22です。
よくある、例としては、いったんページをつくって、「あれ、これってほかと、ほとんどいっしょなんじゃない?」というシチュエーションだろう。
typescriptという前提で、以下書いていく。
部品名をts/components/aaa/Hogeとするならば、
さらに、部品の引数を title とするならば、
ファイル名、Hoge.vue
<template> <b-container> <!-- <h2>部品だよ</h2> --> <slot name="title"></slot> </b-container> </template> <script lang="ts"> import { Component, Prop, Vue, Watch } from "vue-property-decorator"; @Component export default class Hoge extends Vue { } </script>
使うほうが、FugaFuga?.vueだとすると、
<template> <b-container> <ケバブ形式のHoge #部品の変数> 差し込みたいコンテンツ </ケバブ形式のHoge> </b-container> </template> <script lang="ts"> import Hoge from "@/components/commons/Hoge.vue"; import { Component, Prop, Vue, Watch } from "vue-property-decorator"; @Component({ components: { Hoge, }, }) export default class FugaFuga extends Vue { } </script>
のようになる
いろいろ、やりかたがあるっぽいんですが、
自分は、以下のやり方で固定しておこうとおもいます。
こうすることで、利用側は、第一引数で、部品化したクラスの要素を取得
できる。
ちなみに、extendsしてるんだから、protectedでそのまま、
つかえないかとおもって実験してみたけど、別インスタンスになっているようなので、
Javaとは、違うのだということですね。
理由は、利用側と、名前が重複すると、IDEに警告されてしまうから。