【Vue.js】親子間のcomponentで通信をしたい

component間で通信をするには、

  1. propsとカスタムイベントを使用した親子間の通信
  2. イベントパスを使用した非親子間の通信
  3. 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属性が渡っていることが分かります。

データバインディングでリアクティブにデータを受け渡し


See the Pen
データバインディングで親→子へデータを渡す
by りっしー (@hiwriterprogram)
on CodePen.


データバインディングをしつつ、v-forでリストレンダリング


See the Pen
propsとリストレンダリング
by りっしー (@hiwriterprogram)
on CodePen.

こちらは少し難しいかもしれません。
これまでと違う点としては

  1. 親・子側両方でpropsを定義
  2. ルートビュー内のカスタムタグでlistをデータバインディング

の2点です。

$emitを使用して子から親へのデータ送信


See the Pen
$emitによる値の送信
by りっしー (@hiwriterprogram)
on CodePen.