本文實例總結(jié)了vue組件之間通信方式。分享給大家供大家參考,具體如下:
對于vue來說,組件之間的消息傳遞是非常重要的,下面是我對組件之間消息傳遞的各種方式的總結(jié),總共有8種方式。
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ù)據(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) } } }) var app=new Vue({ el:'#app', template:` <div> <parent></parent> </div> ` })在上面的例子中,有父組件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之間有更多的組件,那采用這種方式就很復(fù)雜了。Vue 2.4開始提供了$attrs和$listeners來解決這個問題,能夠讓組件A之間傳遞消息給組件C。
Vue.component('C',{ template:` <div> <input type="text" v-model="$attrs.messagec" @input="passCData($attrs.messagec)"> </div> `, methods:{ passCData(val){ //觸發(fā)父組件A中的事件 this.$emit('getCData',val) } } }) Vue.component('B',{ data(){ return { mymessage:this.message } }, template:` <div> <input type="text" v-model="mymessage" @input="passData(mymessage)"> <!-- C組件中能直接觸發(fā)getCData的原因在于 B組件調(diào)用C組件時 使用 v-on 綁定了$listeners 屬性 --> <!-- 通過v-bind 綁定$attrs屬性,C組件可以直接獲取到A組件中傳遞下來的props(除了B組件中props聲明的) --> <C v-bind="$attrs" v-on="$listeners"></C> </div> `, props:['message'],//得到父組件傳遞過來的數(shù)據(jù) methods:{ passData(val){ //觸發(fā)父組件中的事件 this.$emit('getChildData',val) } } }) Vue.component('A',{ template:` <div> <p>this is parent compoent!</p> <B :messagec="messagec" :message="message" v-on:getCData="getCData" v-on:getChildData="getChildData(message)"></B> </div> `, data(){ return { message:'hello', messagec:'hello c' //傳遞給c組件的數(shù)據(jù) } }, methods:{ getChildData(val){ console.log('這是來自B組件的數(shù)據(jù)') }, //執(zhí)行C子組件觸發(fā)的事件 getCData(val){ console.log("這是來自C組件的數(shù)據(jù):"+val) } } }) var app=new Vue({ el:'#app', template:` <div> <A></A> </div> ` })
新聞熱點
疑難解答
圖片精選