【Vue.js】親子間のcomponentで通信をしたい
component間で通信をするには、
- propsとカスタムイベントを使用した親子間の通信
- イベントパスを使用した非親子間の通信
- Vuexを使用した状態管理
の3つの手段があります。
以下に紹介するのは、 propsとカスタムイベントを使用した親子間の通信です。
propsとカスタムイベントを使用した親子間の通信
以下のようにVue.componentの中で他のcomponentを使用した場合、
- 使用した側 -> 親
- 使用された側 ->子
という関係となります。
Vue.component('my-component', { template: '<p><child-component></child-component></p>' });
また余談ですがVue.jsでは以下のようにタグが2つに分かれているとエラーと判断されます。
Vue.component('my-component', { template: '<p></p><child-component></child-component>' });
2つ以上のタグを用いる場合には、必ず全体を囲むタグを設定して1つの包括的なタグのまとまりを作りましょう。
propsで親→子componentへのデータ受け渡し
See the Pen
eqdPEm by りっしー (@hiwriterprogram)
on CodePen.
上のコードでは、親componentのtemplateの中にcomp-childを設置して、実質上親子関係となっています。
親componentのtemplateの中で属性valをセットしていることがわかります。
template: '<p><comp-child val="これは子A"></comp-child><comp-child val="これは子B"></comp-child></p>'
そして、子componentでは親componentが設定した属性をpropsという項目で受け取っています。
props: ['val']
また、子componentのtemplateではvalを{{}}タグで出力することによってhtmlに出力されていることが分かります。
template: '<p>{{ val }}</p>',
親から子へのデータの受け渡しはvalを含めた属性で行われます。
他の属性も同じく親componentで設定する属性値と、子componentのpropsで受け取りができるため、
//親componentのtemplate <comp-child val="これは子A" style="font-size: 20px;">
//子componentのprops props: ['val','style'] //子componentのtemplate template: '<p style="{{style}}">{{ val }}</p>'
とすることでstyle属性が渡っていることが分かります。
データバインディングをしつつ、v-forでリストレンダリング
See the Pen
propsとリストレンダリング by りっしー (@hiwriterprogram)
on CodePen.
こちらは少し難しいかもしれません。
これまでと違う点としては
- 親・子側両方でpropsを定義
- ルートビュー内のカスタムタグでlistをデータバインディング
の2点です。
$emitを使用して子から親へのデータ送信
See the Pen
$emitによる値の送信 by りっしー (@hiwriterprogram)
on CodePen.