元件通訊的方式
父子通訊
方式一:props
上圖可以理解為兩個過程:1.pass props是父=>子傳遞資料,這個過程中props作為一個載體,將自定義的一些特性傳遞給子元件.
--html
<blog-post message="hello!"></blog-post>
--js
Vue.component('blog-post', {
props: ['message'],
template: '<h3>{{ message }}</h3>'
})
複製程式碼
父級 prop 的更新會向下流動到子元件中,e官方文件中稱為單向資料繫結,這個過程中,子元件只能單向的獲取到父級定義的值, 父元件修改資料之後,子元件中的props也會跟這重新整理為最新的值.
props 可以接受任何型別的值傳遞到子元件,包括:
string,
number,
booler,
object,
function
方式二:events
元件自定義事件,父元件可以在使用子元件的地方直接用 v-on 來監聽子元件觸發的事件
<div id="counter-event-example">
<p>{{ total }}</p>
<button-counter v-on:increment="incrementTotal"></button-counter>
<button-counter v-on:increment="incrementTotal"></button-counter>
</div>
複製程式碼
Vue.component('button-counter', {
template: '<button v-on:click="increment">{{ counter }}</button>',
data: function () {
return {
counter: 0
}
},
methods: {
increment: function () {
this.counter += 1
this.$emit('increment')
}
},
})
new Vue({
el: '#counter-event-example',
data: {
total: 0
},
methods: {
incrementTotal: function () {
this.total += 1
}
}
})
複製程式碼
兄弟通訊
兩個平級的元件之間需要通訊傳遞一些事件,則需要我們建立一個第三方Vue例項,來承載雙方通訊時所要進行的事件.
var Event=new Vue() //作為第三方記錄事件
vue.component('aaa',{
data(){
return{
i_said:'',
}
}
tempate:`
<div>
<input @keyup="on_change" v-model="i_said">
</div>
`,
mothed:{
on_change:function(){
Event.$emit('aaa-said-somthing',this.i_said) //繫結事件,將aaa的輸入資料作為第二個引數傳遞出去
}
}
vue.component('bbb',{
tempate:`
<div>
aaa說:{{aaa_said}}
</div>
`,
data(){
return{
aaa_said:'',
},
mounted:funtion(){
var me = this
Event.$on('aaa_said',function(data){
this.aaa_said=data
})
}
}
})
複製程式碼
兄弟通訊的核心就在於擁有一個第三方排程器,通過它進行任意元件之間的通訊.
爺孫通訊
Vue.component('child', {
props: ['visible'],
template: `
<div>我是兒子
<sunzi v-show="visible" @close="$emit('close')"></sunzi>
</div>
`
})
Vue.component('sunzi', {
template: `
<div>我是孫子
<button @click="$emit('close')">關閉</button>
</div>
`
})
new Vue({
el: '#app',
data: {
message: '我是爺爺',
xxx: false
},
methods:{
log(){
console.log('爺爺知道了')
}
}
})
複製程式碼
<div id="app">
<p>{{ message }}</p>
<button @click="xxx=true">開啟</button>
<child :visible="xxx" @close="xxx=false"></child>
</div>
複製程式碼
這裡爺孫之間的通訊,只要依靠的是子元件的props,
嚴格意義上來講,沒有爺孫通訊,只有父子通訊,因為爺孫祖輩通訊,都可以看成是父子通訊。 直接使用props和$emit並不能直接通訊,但是爺爺可以和兒子通訊,兒子可以和孫子通訊,那麼可以把兒子當作中轉。