Vue.jsはコンポーネントベースのフレームワークで、コンポーネント間のデータの受け渡しは重要な機能です。
この記事では、Vue.jsでよく使用されるコンポーネント間のデータの受け渡し方法について、主に「props」「$emit」そして「provide/inject」という方法をご紹介します。
親子コンポーネント間の通信(propsと$emit)
Vue.jsで最も基本的なデータ通信は、親コンポーネントと子コンポーネント間の通信です。
ここでは、propsを使って親から子へデータを渡し、$emitで子から親へデータを送信する方法を説明します。
propsによるデータの受け渡し
まず、親コンポーネントから子コンポーネントにデータを渡す際には、propsを利用します。
親コンポーネントがデータを渡し、子コンポーネントがそのデータを受け取る流れです。
親コンポーネントでは、data()
でparentMessage
というデータを定義しています。
このデータを子コンポーネントに渡すために、子コンポーネントのタグ<child-component>
に:message="parentMessage"
というpropsバインディングを行います。
message
は親コンポーネントが子コンポーネントにデータを渡すための受け渡し口の名前であり、parentMessage
は親コンポーネントのデータであることを示すデータプロパティです。
子コンポーネントでは、propsオプションを使ってmessage
を受け取り、それを表示します。
ここでは、親コンポーネントから渡されたparentMessage
がmessage
として子コンポーネントに反映されます。
これにより、子コンポーネントは親コンポーネントからのデータを利用できるようになります。
$emitによる子から親へのデータ送信
次に、子コンポーネントから親コンポーネントにデータを送るために、$emitメソッドを使用します。
これにより、親子間の双方向のデータ通信ができるようになります。
子コンポーネントでは、sendMessage
メソッドを定義しています。
このメソッドはボタンがクリックされたときに実行され、this.$emit('message-sent', 'Hello from child!')
が実行されます。
$emitの第1引数message-sentはイベント名、第2引数の'Hello from child!'
はイベントとともに親コンポーネントに送信されるデータ(メッセージ)です。
これによって、カスタムイベント'message-sent'
というイベントとHello from child!
というメッセージが子コンポーネントから親コンポーネントに送られます。
親コンポーネントでは、handleMessage
メソッドを定義します。
子コンポーネントから送られたカスタムイベント'message-sent'
に対応する@message-sent
ディレクティブを使用してイベントをリッスンし、子コンポーネントから送られたメッセージを受け取っています。
そして、同時にhandleMessage
メソッドが呼び出されます。
message
には子コンポーネントから送信された$emitメソッドの第2引数'Hello from child!'
が渡され、console.log(message)
でコンソールに出力されます。
これにより、カスタムイベントを使って親コンポーネントでは子コンポーネントからのデータを利用できます。
provide/injectによるデータの共有
Vue.jsのprovide/injectは、親から子、そして孫コンポーネントにまでデータを直接渡せる仕組みです。
これにより、中間コンポーネントを介さずにデータを共有できるので、構造が深い場合に便利です。
provideで親からデータを共有
親コンポーネントでprovide
オプションを使い、子孫コンポーネントにデータを共有します。
親コンポーネントでは、provide
オプションを使用してsharedMessage
というデータを提供しています。
このsharedMessage
は子や孫コンポーネントに渡すことができます。
今回は、孫コンポーネントに渡していきます。
injectでデータを受け取る
孫コンポーネントでinject
オプションを使い、親コンポーネントから提供されたデータを受け取ります。
inject
を使うことで、親コンポーネントのデータsharedMessage
を孫コンポーネントで受け取ることができます。
子コンポーネントには、データの受け渡しの記載は不要です。孫コンポーネントの定義をしています。
このように、provide/injectを利用すれば、中間の子コンポーネントを経由せずにデータを渡すことができるため、コンポーネント階層が深い場合に便利です。
まとめ
このブログでは、Vue.jsにおけるコンポーネント間の通信に焦点を当て、「propsと$emit」および「provide/inject」の2つの通信パターンについて解説しました。
これらの通信パターンはVue.jsの基本的な機能なので、理解しておくとよりフレキシブルにフロントエンドアプリケーション開発をすることができます。
ぜひご自身の環境でも実践してみてください!
Vue.jsの基本セットアップ、データバインディング、ルーティングについて知りたい方は、こちらもご覧ください!
コメント