通常狀況下,組件間的通訊傳值分爲三種狀況:vue
使用prop傳值,子組件使用props
接受數據vuex
parent.vue
//部分代碼省略---
<child
:prop='data'>
</child>
child.vue
props:['data'],
複製代碼
使用場景:
對子組件進行傳值,不會對子組件進行操做;
注意:數組
v-bind
,否則Vue會所有當成字符串處理(字符串傳遞除外);v-bind='propObj'
的方式,propObj
是一個有屬性的對象;v-bind='$props'
的方式,將父組件的props
傳值給子組件;localData=this.data
。可是若prop爲數組或者對象時,需使用深拷貝;computed:{
myDataTrim(){
return this.myData.trim();
}
}
複製代碼
7.子組件中,style/class不容許接收;瀏覽器
插槽
能夠經過插槽的方式,將父組件的內容傳遞到子組件,能夠在子組件中設置默認值。bash
parent.vue
//部分代碼省略---
<child>
hello
</child>
child.vue
<div>
<slot>
默認值
</slot>
</div>
//渲染結果:<div>hello</div>
複製代碼
使用場景:
傳遞給子組件,在子組件特定的位置渲染展現出來。傳遞的內容甚至能夠爲DOM元素、組件等。
注意:ide
parent.vue
//部分代碼省略---
<child>
<template v-slot:slotName>
hello
</template>
//默承認以使用兩種方式
<template v-slot:default>
world
</template>
//or
world
</child>
child.vue
<div>
<slot name='slotName'>
默認值1
</slot>
<div>
<slot>
默認值2
</slot>
</div>
</div>
複製代碼
v-slot
通常寫在template
中;v-slot --> #
,特殊狀況:默認插槽#default
;父組件獲取子組件實例(ref)
在父組件中調用子組件時,設置ref
屬性,而後就能夠經過this.$refs[設置的值]
獲取子組件的實例。函數
parent.vue
//部分代碼省略---
<child ref='childRef'>
</child>
//methods
getChildData(){
let data=this.$refs.childRef.data;
}
複製代碼
使用場景:
當父組件想獲取子組件的數據、方法時,能夠經過這種方式進行獲取數據、調用方法;
注意:學習
ref
設置在DOM元素上時,獲取的是DOM元素;$refs
是一個對象,收集全部設置過ref
的DOM元素或組件實例;非prop特性(attrs`對象中;
使用場景:ui
v-bind:$attrs
綁定在特定的元素上;v-bind:$attrs
傳遞給子組件的子組件---跨級傳值; 注意:inheritAttrs:false
,可使非prop的特性不綁定在根元素上;children[0].$children`跨級獲取組件的實例;
使用場景:this
自定義事件名[,...param]
)parent.vue
//部分代碼省略---
<child
@event1='handMethod()'>
</child>
child.vue
methods:{
setparent(){
this.$emit('handMethod');
}
}
複製代碼
使用場景:v-bind
進行綁定,這樣就能夠經過v-slot:slotName:props
的方法接收數據了,全部的插槽prop都接收在一個對象中;parent.vue
//部分代碼省略---
<child>
<template v-slot:slot1='data'>
data.data
</template>
</child>
child.vue
<slot name ='slot1' :data='data'></slot>
複製代碼
使用場景:v-model
綁定須要進行"雙向綁定"的數據,在子組件能夠經過model:{}
進行設置v-model
綁定的prop和事件名,而後能夠在須要調用的地方調用;parent.vue
//部分代碼省略---
<child v-model='data'>
</child>
child.vue
<div>
<input
type='text'
:value='data'
@input="$emit('customEvent', $event.target.value)">
</div>
export default {
model:{
prop:'data',
event:'customEvent',
},
props:[data]
}
複製代碼
使用場景://前面的例子
<child v-model='data'>
</child>
or
<child
:data='data'
@customEvent='data=$event'
>
</child>
複製代碼
parent.vue
//部分代碼省略---
<child :title.sync='title'>
</child>
child.vue
this.$emit('unpdate:title',newData);
複製代碼
使用場景:parent.vue
//部分代碼省略---
<child
:title='title'
@update:title='title=$event'>
</child>
複製代碼
$attrs
和$listeners
能夠在子組件中再經過v-bind:$attrs
以及v-on="$listeners"
的方式進行跨級的通訊傳值;
好比能夠實現.sync
和v-model
的功能(須要最初傳入的組件配合);
let bus = new Vue();
//一個組件中綁定
bus.$on('evnet1',()=>{
});
組件銷燬前
beforeDestroy(){
bus.$off('evnet1');
}
//另一個組件中調用
bus.$emit('evnet1'[,...param]);
複製代碼
$route
的值,進行相應的操做。對一些經常使用的組件間通訊傳值方法的使用與場景的理解,理解的比較粗略。後續可能會對Vuex以及provide/inject
等方法進行一些學習---看狀況而定。