国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

vue組件之間通信方式實例總結(jié)【8種方式】

2024-05-06 15:42:10
字體:
供稿:網(wǎng)友

本文實例總結(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>    `  })            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 富锦市| 会泽县| 兴安盟| 申扎县| 高安市| 裕民县| 东乡族自治县| 托克逊县| 青海省| 汾阳市| 三台县| 砚山县| 临猗县| 扎鲁特旗| 桃江县| 昆明市| 商洛市| 庆阳市| 石嘴山市| 五河县| 上饶市| 洪洞县| 青龙| 黄梅县| 庆安县| 桦川县| 越西县| 鹤岗市| 盐津县| 安西县| 和田县| 土默特左旗| 土默特右旗| 即墨市| 安塞县| 马龙县| 白河县| 秦安县| 阜阳市| 巴南区| 双江|