はじめに
本記事は編集中なので、全方法は網羅していません。
ググったときにvuexとかばかり出てきて忘れてしまうので、早見表みたいな位置づけです。
コードも具体的な呼び出し方を示すためのみで、コンポーネントとしての動作は確認していないので注意が必要です。
(公式にもほぼおなじ記事があったのでそっちの方見たほうがよさそう)
親コンポーネントにアクセスする方法
$parent
$parent
を使うと、1個上のコンポーネントにアクセスできる。使い方は以下のように、methodやdataへアクセスできる。
//子 export default { methods:{ parentAccess(){ this.$parent.parentMethod(this.$parent.parentData) } } } //親 export default { data:function(){ return { parentData: "parant" } }, methods:{ parentAccess(showData){ console.log(showData) } } }
なお$parent.$parent
とすると2個上の親コンポーネントにアクセスできるが、このような方法は当然ながら推奨されてない。
代わりに次の項目に示すような依存性をコンポーネントに注入する方法を使う方法がある。
provide/injectによる依存性注入
簡単に言うと、provide
がexportみたいな役割で、inject
がimportみたいな役割をしている。
それぞれdata
やmethods
と同じようにコンポーネントのキーとして設定する。
//子 export default { inject:['parentMethod'], method:{ this.parentMethod("execute parent method") }, } //親 export default { provide(){ return { parentMethod: this.show } }, methods:{ show(showData){ console.log(showData) } } }
現状ではmethods以外では確認できていないが、おそらくdata等も渡せるのではないかと思う。
子コンポーネントにアクセスする方法
ref属性
Vue.jsではコンポーネントを利用するときにtemplate
で子コンポーネントのHTMLタグにref
属性を付与することで、親コンポーネント側で$refs
を使うことで操作することができる。
//子 export default { data():{ return { childData:"get child data" } } } //親 <template> <child ref="ch" /> </template> <script> from 'Child' import '~/components/Child.vue' export default { component:{ 'Child' }, methods:{ show(){ console.log(this.$refs.ch.childData) } } } </script>
それぞれの注意点
ref
やprovide
とinject
による依存性注入はいずれもリアクティブではない、つまり変更を検知できない。
なので使い所としては、ある時点のデータを利用する使い方のみに限定される。computedで監視させて動的に変化させるのはコンポーネント越しだと難しい。(データを持っているコンポーネントで監視させて、検知した際の動作で他コンポーネントを操作する方法する等リアクティブな動作を再現できなくはない)
provide/inject
に関しては、公式のドキュメントで通常のアプリケーションでの使用は控えるよう注意書きがあるので、これらを使うときは注意したい。