傳值方式有:props和“$emit”、“$attrs”和“$listeners”、中央事件總線、v-model、provide和inject、“$parent”和“$children”、vuex和localStorage/session。
本教程操作環(huán)境:windows7系統(tǒng)、vue2.9.6版,DELL G3電腦。
對于vue來說,組件之間的消息傳遞是非常重要的,下面是我對組件之間消息傳遞的常用方式的總結(jié)。
-
props和$emit(常用)
-
$attrs和$listeners
-
中央事件總線(非父子組件間通信)
-
v-model
-
provide和inject
-
$parent和$children
-
vuex
1、props和$emit
父組件向子組件傳遞數(shù)據(jù)是通過prop傳遞的,子組件傳遞數(shù)據(jù)給父組件是通過$emit觸發(fā)事件來做到的.
Vue.component('child',{ data(){ return { mymessage:this.message } }, template:` <div> <input type="text" v-model="mymessage" @input="passData(mymessage)"> </div> `, props:['message'],//設(shè)置props屬性值,得到父組件傳遞過來的數(shù)據(jù) methods:{ passData(val){ //觸發(fā)父組件中的事件,向父組件傳值 this.$emit('getChildData',val) } } }) Vue.component('parent',{ template:` <div> <p>this is parent compoent!</p> <child :message="message" v-on:getChildData="getChildData"></child> </div> `, data(){ return { message:'hello' } }, methods:{ //執(zhí)行子組件觸發(fā)的事件 getChildData(val){ console.log(val) } } })
在上面的例子中,有父組件parent和子組件child。
1)父組件傳遞了message數(shù)據(jù)給子組件,并且通過v-on綁定了一個getChildData事件來監(jiān)聽子組件的觸發(fā)事件;
2)子組件通過props得到相關(guān)的message數(shù)據(jù),最后通過this.$emit觸發(fā)了getChildData事件
2、$attrs和$listeners
第一種方式處理父子組件之間的數(shù)據(jù)傳輸有一個問題:如果父組件A下面有子組件B,組件B下面有組件C,這時如果組件A想傳遞數(shù)據(jù)給組件C怎么辦呢? 如果采用第一種方法,我們必須讓組件A通過prop傳遞消息給組件B,組件B在通過prop傳遞消息給組件C;要是組件A和組件C之間有