props、$emitで親子コンポーネント間でデータをやり取り(同期)する(v-bind、v-on) [Vue.js]

Vue.js The Progressive JavaScript Framework

Vue.jsでは、propsと$emitを使用して、親コンポーネントと子コンポーネントの間でデータをやり取りします。

コンポーネント間の通信 親から子へデータを渡すprops [Vue.js]
Vue.jsのコンポーネントは、Vueインスタンスを生成してアプリケーションを作成する場合と同様に、コンポーネント用のデータ(dat...
コンポーネント間の通信 子から親へイベントを通知する$emit [Vue.js]
前回の記事では子コンポーネントにはpropsを経由して、親側のアプリケーションやコンポーネント(以下親コンポーネントと記載)のデータ...

子コンポーネント側にpropsで定義したプロパティには、親コンポーネント側でv-bindディレクティブを使用してデータをバインドします。

v-bindディレクティブでHTML要素の属性にバインドする [Vue.js]
本記事では、Vue.jsのv-bindディレクティブについて紹介します。 v-bindディレクティブ HTMLの要素はcla...

子コンポーネント側で$emitを使用して発行したイベントには、親コンポーネント側でv-onディレクティブを使用してメソッドや式をバインドします。

v-onディレクティブでイベントの処理(メソッドや式)をバインドする [Vue.js]
本記事では、Vue.jsのv-onディレクティブについて紹介します。 v-onディレクティブ ユーザーからの操作を受け付ける...

本記事では、propsに定義したプロパティと$emitで定義したイベントを、親コンポーネントのv-bindディレクティブ、v-onディレクティブでバインドしてデータをやり取りする方法について紹介します。

子コンポーネントの実装

子コンポーネント側の実装例を示します。
ここでは簡単な例として、type属性にnumberを指定したinput要素を子コンポーネントに配置します。

HTML

JavaScript

子コンポーネントでは、input要素にv-bindディレクティブでpropsに定義したnumberValueプロパティをバインドします。(HTMLの4行目)
v-onディレクティブでinput要素のinputイベントにメソッドをバインドし、メソッドでは$emitで「number-input」イベントを発行します。
「number-input」イベントを発行する$emitでは、引数にinput要素のvalueを指定します。(JavaScriptの12行目)
ここで指定した第2引数のデータを親コンポーネント側で受け取ります。

親コンポーネント(アプリケーション)の実装

親コンポーネント側の実装例を示します。
親コンポーネントでは、子コンポーネントをHTMLテンプレートに配置し、子コンポーネントにバインドしたデータを表示するためのdiv要素を配置します。

HTML

JavaScript

親コンポーネントでは、dataオプションに定義したvalueプロパティのデータ(JavaScriptの7行目)を子コンポーネント(input-number)で定義したpropsの「number-value」にv-bindディレクティブでバインドします。(HTMLの2行目)
子コンポーネントで発行したnumber-inputイベントをv-onディレクティブでバインドし「value = $event」を指定することにより、dataオプションに定義したvalueプロパティのデータを、子コンポーネントの$emitで指定した引数の値で更新します。(HTMLの3行目)

実行結果

上記のソースを実行すると以下のようなが画面が表示され、親コンポーネントと子コンポーネント間でデータが同期していることが確認できます。

propsと$emitで親子コンポーネント間のデータを受け渡しした結果

Vue.jsでの親子コンポーネント間でのデータのやり取りは、「Props down, Event up」が基本ですので、上記の方法でデータをやり取り(同期)することができますが、Vue.jsでは、データを同期する方法としてv-modelディレクティブの実装があります。

次回は、親コンポーネントでv-modelディレクティブを使用して子コンポーネントとデータをやりとりするするための、子コンポーネントの実装について紹介します。

コンポーネントにv-modelディレクティブを実装する(props, $emit)[Vue.js]
前回は子コンポーネントに実装したpropsと$emitを利用して、親コンポーネントのデータをやり取り(同期)する方法を紹介しました。...

Vue.js 入門 Tips 一覧