1つのコンポーネントに複数のv-modelディレクティブでのバインディングを適用する [Vue.js]

Vue.js The Progressive JavaScript Framework

前回の記事では子コンポーネントにpropsと$emitを実装し、親コンポーネントからv-modelディレクティブを使用して双方向バインディングを行いデータをやり取り(同期)する方法を紹介しました。

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

Vue.jsのバージョンが2.x以前の時は、コンポーネントのカスタム要素で指定するv-modelディレクティブは、以下のように1つしか記述できませんでした。

しかし、バージョン3.xからは、単一のコンポーネントの要素(インスタンス)に対して以下のように複数のv-modelディレクティブを使用できるようになりました。

複数の v-model のバインディング – Vue.js

そこで今回は、単一のコンポーネントインスタンスで、複数のv-modelディレクティブを使用する方法について紹介します。

1つのコンポーネントにv-modelディレクティブで複数のデータをバインドする

1つのコンポーネントで複数のデータをv-modelディレクティブでバインドするのは、とても簡単です。
子コンポーネント側のpropsに複数のプロパティを定義して、親コンポーネント側のHTMLテンプレートで単一のコンポーネント要素にv-modelディレクティブでのバインドを複数記述するだけです。

子コンポーネントの実装

以下に子コンポーネントの実装例を示します。
ここでは、顧客(カスタマー)情報を編集するための簡単なコンポーネントの「顧客シート」を作成します。

HTML

JavaScript

子コンポーネントのHTMLテンプレートには、氏名(姓・名)と性別、生年月日をフィールドとして配置します。
そして、配置したフィールドにデータをバインドするためのプロパティをpropsにそれぞれ定義します。ここでは氏名(名)をfirstName、氏名(姓)をlastName、性別をgender、生年月日をbirthdayというプロパティで定義しています。
propsに定義したプロパティはそれぞれのフィールドにv-bindディレクティブでバインドし、v-onディレクティブでinputイベントに$emitメソッドを指定しています。

親コンポーネントの実装

HTML

JavaScript

親コンポーネント側では、顧客シートコンポーネントをHTMLテンプレートに定義し、コンポーネントのpropsに定義したプロパティをv-modelディレクティブでバインドします。

実行結果

上記の子コンポーネントと親コンポーネントのソースコードを実行した結果は次のようになります。

Vue.js v-modelディレクティブで1つのコンポーネントに複数バインドする例の実行結果

氏名、性別、生年月日に値を入力すると、バインドしているデータが表示されることが確認できます。

Vue.js v-modelディレクティブで1つのコンポーネントに複数バインドする例でデータを入力した結果

性別では、option要素に定義したvalueがバインドされ、生年月日では日付の「YYYY-MM-DD」形式のデータがバインドされています。

実行結果がすぐ確認できるようにjsFiddleのHTMLパネルに貼り付けて実行できるコードを記載しておきます。

jsFiddleの使い方については、以下の記事を参考にしてください。

jsFiddle 簡単手軽にHTMLページのコーディング(実装)とシェア(共有)ができる超便利なWebサービス
Webサイトの制作やWebシステムの開発をしている方だと経験がしたことがあると思いますが、本格的に実装をする前にちょっと動作の確認や...

親コンポーネントのデータをオブジェクトにまとめる

上記のコードで親コンポーネントのdataオプションに定義しているデータは、オブジェクトにまとめることもできます。

先に示した実装例のコードで、親コンポーネントのdataオプションに定義するプロパティを、オブジェクト形式にした場合の例を以下に示します。

ここでは、dataオプションに定義していたfirstName、lastName、gender、birthdayをcustomerというオブジェクトにまとめています。(96行目から100行目)

Vue.js 入門 Tips 一覧