Vue組件通信的四種方式匯總
前言
眾所周知vue是一種mvvm框架,它相對于jquery可能比較大的差異點之一就在于組件之間的通信了。本文重點是梳理了前兩個,父子組件通信和eventBus通信,我覺得Vue文檔里的說明還是有一些簡易,我自己第一遍是沒看明白。
- 父子組件的通信
- 非父子組件的eventBus通信
- 利用本地緩存實現(xiàn)組件通信
- Vuex通信
第一種通信方式:父子組件通信
父組件向子組件傳遞數(shù)據(jù)
父組件一共需要做4件事
1.import son from './son.js' 引入子組件 son
2.在components : {"son"} 里注冊所有子組件名稱
3.在父組件的template應(yīng)用子組件, <son></son>
4.如果需要傳遞數(shù)據(jù)給子組件,就在template模板里寫 <son :num="number"></son>
// 1.引入子組件 import counter from './counter' import son from './son'
// 2.在ccmponents里注冊子組件
components : {
counter,
son
},
// 3.在template里使用子組件 <son></son>
// 4.如果需要傳遞數(shù)據(jù),也是在templete里寫 <counter :num="number"></counter>
子組件只需要做1件事
1.用props接受數(shù)據(jù),就可以直接使用數(shù)據(jù)
2.子組件接受到的數(shù)據(jù),不能去修改。如果你的確需要修改,可以用計算屬性,或者把數(shù)據(jù)賦值給子組件data里的一個變量
// 1.用Props接受數(shù)據(jù) props: [ 'num' ],
// 2.如果需要修改得到的數(shù)據(jù),可以這樣寫
props: [
'num'
],
data () {
return {
number : this.num
}
},
子組件向父組件傳遞數(shù)據(jù)
父組件一共需要做2件事情
在template里定義事件
在methods里寫函數(shù),監(jiān)聽子組件的事件觸發(fā)
// 1. 在templete里應(yīng)用子組件時,定義事件changeNumber <counter :num="number" @changeNumber="changeNumber" > </counter>
// 2. 用changeNumber監(jiān)聽事件是否觸發(fā)
methods: {
changeNumber(e){
console.log('子組件emit了',e);
this.number = e
},
}
子組件一共需要1件事情
在數(shù)據(jù)變化后,用$emit觸發(fā)即可
// 1. 子組件在數(shù)據(jù)變化后,用$emit觸發(fā)即可,第二個參數(shù)可以傳遞參數(shù)
methods: {
increment(){
this.number++
this.$emit('changeNumber', this.number)
},
}
第二種通信方式: eventBus
eventBus這種通信方式,針對的是非父子組件之間的通信,它的原理還是通過事件的觸發(fā)和監(jiān)聽。
但是因為是非父子組件的關(guān)系,他們需要有一個中間組件來連接。
我是使用的通過在根組件,也就是#app組件上定義了一個所有組件都可以訪問到的組件,具體使用方式如下
使用eventBus傳遞數(shù)據(jù),我們一共需要做3件事情
1.給app組件添加Bus屬性 (這樣所有組件都可以通過this.$root.Bus訪問到它,而且不需要引入任何文件)
2.在組件1里,this.$root.Bus.$emit觸發(fā)事件
3.在組件2里,this.$root.Bus.$on監(jiān)聽事件
// 1.在main.js里給app組件,添加bus屬性
import Vue from 'vue'
new Vue({
el: '#app',
components: { App },
template: '<App/>',
data(){
return {
Bus : new Vue()
}
}
})
// 2.在組件1里,觸發(fā)emit
increment(){
this.number++
this.$root.Bus.$emit('eventName', this.number)
},
// 3.在組件2里,監(jiān)聽事件,接受數(shù)據(jù)
mounted(){
this.$root.Bus.$on('eventName', value => {
this.number = value
console.log('busEvent');
})
},
第三種通信方式: 利用localStorage或者sessionStorage
這種通信比較簡單,缺點是數(shù)據(jù)和狀態(tài)比較混亂,不太容易維護(hù)。
通過window.localStorage.getItem(key) 獲取數(shù)據(jù)
通過window.localStorage.setItem(key,value) 存儲數(shù)據(jù)
注意:用JSON.parse() / JSON.stringify() 做數(shù)據(jù)格式轉(zhuǎn)換。
第四種通信方式: 利用Vuex
Vuex比較復(fù)雜,可以單獨寫一篇
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Vue?Echarts實現(xiàn)多功能圖表繪制的示例詳解
作為前端人員,日常圖表、報表、地圖的接觸可謂相當(dāng)頻繁,今天小編隆重退出前端框架之VUE結(jié)合百度echart實現(xiàn)中國地圖+各種圖表的展示與使用;作為“你值得擁有”專欄階段性末篇,值得一看2023-02-02
vue中動態(tài)出來返回的時間秒數(shù)(在多少秒顯示分、小時等等)
這篇文章主要給大家介紹了關(guān)于vue中動態(tài)出來返回的時間秒數(shù)(在多少秒顯示分、小時等等)的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),對大家學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01
vue中使用axios post上傳頭像/圖片并實時顯示到頁面的方法
今天小編就為大家分享一篇vue中使用axios post上傳頭像/圖片并實時顯示到頁面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09

