props
和$emit
父組件向子組件傳遞數據是經過prop
傳遞的,子組件傳遞數據給父組件是經過$emit
觸發事件來作到的.sync
和 v-model
的使用(父子組件數據同步)$parent
,$children
多層級傳遞數據,智能組件封裝$attrs
(屬性的集合)和$listeners
(方法的集合)。Vue 2.4 開始提供了$attrs
和$listeners
來解決A->B->C問題,組件間向下傳遞,能夠不用 props
註冊。v-bind
屬性傳遞,v-on
方法傳遞provider
來提供變量,而後在子組件中經過inject
來注入變量。$refs
獲取實例envetBus
平級組件數據傳遞 這種狀況下可使用中央事件總線的方式父組件vue
<template>
<div>
父組件:{{money}}
<son1 :money='money' @addMoney = 'addMoney'></son1>
</div>
</template>
<script>
import son1 from './son1'
export default {
components:{
son1
},
data(){
return {
money:100
}
},
methods:{
addMoney(val){
this.money = val
}
}
}
</script>
複製代碼
子組件 son1.vuevue-router
<template>
<div>
兒子1得到{{money}}
<button @click="raiseMoney">多給點嘛</button>
</div>
</template>
<script>
export default {
props:{
money:{
type:Number,
default:1
}
},
methods:{
raiseMoney(){
this.$emit('addMoney',200)
}
}
}
</script>
複製代碼
.syncbash
update:myPropName
的模式觸發事件取而代之父組件 <son1 :money.sync='money'></son1>
子組件 this.$emit('update:money',200)
父組件 <son1 :money="money" @update:money="(val)=>this.money=val"></son1>
子組件this.$emit('update:money',200)
v-modelapp
<son1 :value="money" @input="(val)=>this.money=val></son1>
<son1 v-model="money"></son1>
value
,具備侷限性,而.sync
則能夠隨意起名字$parent
$children
<button @click="$parent.$emit('addMoney',400)">更改父組件</button>
$parent
下去,這樣會很麻煩,不如直接封裝一個$dispatch
$dispatch
只會通知本身對父親, 而eventBus
是全局通知,通知全部的父親或者兒子dispatch
向上通知dom
Vue.prototype.$dispatch = function (eventName,value){
let parent = this.$parent;
while(parent){
parent.$emit(eventName,value);
parent = parent.$parent
}
}
使用時只須要 this.$dispatch('addMoney',400)
//666 親測無誤
複製代碼
向下傳遞ide
$broadcast
Vue.prototype.$broadcast = function (eventName,value){
//獲取當前組件下的因此孩子
const broadcast = (children) => {
children.forEach(child => {
child.$emit(eventName,value);
if(child.$children){
broadcast(child.$children)
}
})
}
broadcast(this.$children)
}
使用時只須要 在父級 this.$broadcast('say',1111) 只要子組件中有綁say的都給我說1111
在son1.vue中
<Grandson :money = money @say='say1'></Grandson>
methods:{
say1(val){
console.log("我很帥"+val)
}
}
<!--親測控制檯打印 我很帥1111-->
複製代碼
$attrs
屬性的集合$attrs
表明上級傳過來的全部屬性,當父組件給子組件須要穿過來不少值時,用props一個一個接收豈不是很累,使用$attrs
就能夠一次性把父級傳過來當全部值接收到,完美~$attrs
接收完數據,打開控制檯,你會發現以下狀況,屬性所有掛載在了dom上,咱們並不想這樣
解決:在使用$attrs
的子組件上,添加inheritAttrs:false
,代碼以下<!--父組件-->
<son2 name="奔跑" address="北京"></son2>
<!--子組件-->
template>
<div>
<!-- $attrs表明上級傳過來的全部屬性 -->
兒子2: {{$attrs}}
</div>
</template>
<script>
export default {
inheritAttrs:false
}
</script>
<!--頁面顯示:兒子2: { "name": "奔跑", "address": "北京" }-->
複製代碼
<grandson2 v-bind="$attrs"></grandson2>
$attrs
便可得到全部的數據$listeners
方法的集合$listeners
來調用這些方法v-on="$listeners"
來傳遞給孫子組件這些方法,孫子組件使用時,一樣使用$listeners
<!--父組件-->
<son2 name="奔跑" address="北京" @look="console.log('look')"></son2>
<!--子組件-->
<grandson2 v-bind="$attrs" v-on="$listeners"></grandson2>
<!--孫子組件-->
<template>
<div>
孫子2:{{$attrs}}
<button @click="$listeners.look()">看</button>
</div>
</template>
<!--在孫子組件上點擊按鈕'看',則會在控制檯打印'look'-->
複製代碼
provide
提供變量,inject
註冊變量this.$router.go(0)
;location.reload()
; window.open
一下【祖先組件(provide )向其全部子孫後代(inject )注入一個依賴】ui
$refs
獲取實例ref
被用來給元素或者子組件註冊引用信息。引用信息將會註冊在父組件的$refs
對象上。$refs
;$refs
相對document.getElementById
的方法,會減小獲取dom節點的消耗。$refs
只在組件渲染完成後才填充,而且它是非響應式當。它僅僅是一個直接操做子組件的應急方案---應當避免在模版或者計算屬性中使用$refs
<!--父級-->
<son2 name="奔跑" address="北京" ref="son2"></son2>
mounted(){
this.$refs.son2.sleep()
},
<!--son2子組件-->
methods:{
sleep(){
console.log('我想睡覺')
}
}
複製代碼
eventBus
定義到了全局上,經過$on(eventName,function)
註冊事件,經過$emit(eventName,參數)
獲取使用事件<!--在mian.js上註冊bus-->
Vue.prototype.$bus = new Vue();
<!--在恰當的頁面 註冊事件-->
this.$bus.$on('有人找我了',function(val){
console.log('呵呵'+val)
})
<!--在恰當的頁面 使用事件-->
this.$nextTick(()=>{
this.$bus.$emit('有人找我了','xxx')
})
<!--控制檯打印-->
呵呵xxx
複製代碼