最常規的父子組件傳值方法,在此很少贅述javascript
值得一提的是,子組件中能夠用 $attrs
獲取父組件傳來的全部屬性(除了 class、style),從而不用一個個聲明 prop
。java
若是不用 prop
聲明接收,Vue 會默認將這些屬性掛載到 子組件的 dom 根元素上。若是不但願這樣,能夠設置 inheritAttrs
去除這一默認行爲。api
export default {
inheritAttrs: false
}
複製代碼
若是須要傳給更深一層的子組件,只需經過 v-bind="$attrs"
傳入dom
除了 $emit
能夠向父組件分發事件以外ide
還有一個與 $attrs
相似的一個 api :$listener
,能夠拿到父組件上的全部事件監聽器。一樣的,v-on="$listeners"
能夠將之傳給更深一層的子組件this
經過 $listeners.xxx
能夠直接觸發父組件的 xxx 監聽器spa
插槽最多見的用法是:在子組件中使用 slot
插槽,在父組件中對其進行填充,能夠是具名插槽也能夠是匿名插槽。code
除了這種用法之外,父組件還能夠拿到子組件在插槽上傳遞的數據,也就是做用域插槽:事件
子組件中經過 v-bind 綁定數據ip
<template>
<div class="child">
<slot v-bind:data="data"></slot>
</div>
</template>
複製代碼
父組件中能夠經過 v-slot
接收
<child v-slot:default="slotData">
{{ slotData.data }}
</child>
複製代碼
父組件能夠將一些共享的數據注入,後代經過 inject
選項接收後直接可使用,這些數據將會是共享的。
// 父組件中
provide(){
return {
parentData: this.data
}
}
// 子組件中
inject: ['parentData']
// 經過 this.parentData 便可訪問
複製代碼
甚至,你還能夠將父組件整個共享:
provide(){
return {
parent: this
}
}
複製代碼
經過 this.$parent
能夠訪問到父組件的數據,this.$parent.$parent
能夠訪問到爺組件。
與此相似,還有 this.$children
可是過分使用可能會形成代碼混亂,尤爲是組件嵌套很深時。
// 父組件
data(){
return {
bus: new Vue()
}
}
provide(){
return {
eventBus: this.bus
}
}
複製代碼
這裏借用到上面的注入方法,不過此次注入的是一個 Vue 實例,緣由是:這裏注入的內容應該是一個事件中心,恰好 Vue 實例提供了 $on $emit
方法,咱們能夠直接借用
至於爲何要放在 data
中,是由於這樣父組件也能夠拿到這個 eventBus
,也能夠進行事件的監聽和分發。
在其餘組件中接收這個事件中心:
inject: ['eventBus']
複製代碼
當須要監聽事件時,只須要經過 $on
添加事件監聽器便可:
this.eventBus.$on('change', (data) => {
// ...
})
複製代碼
當分發一個事件後,全部監聽了這個事件的組件都會觸發回調,拿到傳遞的數據:
this.$eventBus.$emit('change', someData)
複製代碼