概要
Vue.jsのコンポーネント間での通信をまとめました。初心者向けです。
Vuexを使用しない方法と、使用した方法のサンプルを元に説明します。
Vue.jsのみ
See the Pen Vue.js Simple Components Communication by T_Y (@ymnk) on CodePen.
説明
親コンポーネントと子コンポーネントとで相互に通信しているサンプルです。
本やブログには、親から子はprops
、子から親はevent
と書いてあることが多いです。
ですが、それだけでは不十分だと感じたので、少し丁寧に説明してみます。
親から子へ値を渡す
親コンポーネントのボタンを押すと子コンポーネントの値が増える。
- 子コンポーネント:受け取る値を
props
で設定する。 - 親コンポーネント:子コンポーネントに渡す値を
data
で設定する。 - 子コンポーネントのタグ:
v-bindディレクティブ
を設定して1と2を紐づける。
親から子のメソッドを実行する
親コンポーネントのボタンを押すと、子コンポーネントのデザインが切り替わる。
- 子コンポーネント:親コンポーネントから実行するメソッドを設定する。
- 子コンポーネントのタグ:
ref
を設定する。 - 親コンポーネント:
$refs
を使い、子コンポーネントのメソッドを実行する。
子から親のメソッドを実行する
子コンポーネントのボタンを押すと、親コンポーネントの値が増える。
- 親コンポーネント:子コンポーネントから呼び出すメソッドを設定する。
- 子コンポーネントのタグ:
v-onディレクティブ
を設定し、子コンポーネントから1を実行できるようにする。 - 子コンポーネント:
$emit
を使って2を実行する。
Vue.js + Vuex
See the Pen Vue.js Components Communication With Vuex by T_Y (@ymnk) on CodePen.
説明
Vuexは複雑なアプリケーションの状態管理をするためのライブラリです。適切なデータフローを設計するために使います。
値をstore
で一括管理することで、どのコンポーネントからでも使用できるようになります。
サンプルでは、親コンポーネントのボタンからstore
を更新し、子コンポーネントで値を表示しています。
Storeの説明
名前 | 役割 | 呼び出し方 |
---|---|---|
state | 値の一覧 | store.state.名前 |
getters | 値の取得 | store.getters('名前') |
mutations | 値の設定 | store.comit('名前', 値) |
actions | 値の計算と設定 | store.dispatch('名前') |
注意事項
- 単一コンポーネント使った場合、呼び出しは
store
でなくthis.$store
と書く。 -
state
はstore.state
で直接呼ばず、getters
に統一するようルール化するとよい。