本文同步刊載於Andy's Blog
這兩天介紹完Vue第一種元件之間的溝通方式,props in ,emit out
,並且針對props使用上也做了用法上的提醒如:單向資料流
、型別驗證
、動態載入屬性Vs靜態載入屬性
、Non-Prop Attributes
。若想了解這些內容,我也把連結附在下方。
1.Day16 Vue Component(元件) props、emit介紹
2.Day17 Vue Component(元件) - props使用注意細項(1)
2.Day18 Vue Component(元件)-props使用注意細項(2)
而我們今天要認識另一種元件與元件之間溝通方式,$parent
、$children
。(雖然介紹這種方法,但開發上還是建議少用XD),那我們就開始吧!
子元件可以透過this.$parent,來存取父層組件。這種方法用起來就是爽XD,不用在子元件中發送$emit事件,來呼叫父元件。
使用時機:通常使用情境都是在debug上,開發上還是不建議透過子元素來覆寫父層元素。
原因:直接透過子元素來覆寫父層元素,
會造成父元件跟子元件耦合過深重
,日後無法單獨把這個子元件拉出來使用。
連結
HTML部分
<div id="app">
<my-component ref="comp1" :parent-msg="msg"></my-component>
</div>
JavaScript部分
Vue.component('my-component',{
template:`<div>{{parentMsg}}</div>`,
props: ["parentMsg"],
mounted(){
console.log("$parent",this.$parent.msg);
window.setTimeout(() =>{
this.$parent.msg="Hello"
},2000)
},
})
new Vue({
el:'#app',
data:{
msg:'Msg of Parent'
}
})
說明:我們在兩秒過後,把父層msgMsg of Parent
,更改為Hello
父元件可以透過this.$children,來存取子組件(陣列)。至於為何是陣列,我們可以來複習一下這張圖。圖片中可以發現每個子元件都只會有一個父元素,但是父元素就不同摟,他可能會有0~無限個子元素。
這也就是為何取出來是陣列原因!
為了不讓v-if
影響子元件顯示順序,我們可以透過幫子組件設定別名ref,來確保組件順序不受影響。
練習連結
HTML部分
<div id="app">
<my-component2 ref="comp2"></my-component2>
<my-component3 ref="comp3"></my-component3>
<hr>
<div> {{ msg }}</div>
</div>
JavaScript部分
new Vue({
el: '#app',
data: {
msg: 'Msg of Parent!'
},
mounted() {
console.log(this.$children[0]) // VueComponent,my-component3
console.log('$children2: ', this.$refs.comp2.msg); //Hi COMP2
console.log('$children3: ', this.$refs.comp3.msg); //Hi COMP3
}
});