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

首頁 > 編程 > JavaScript > 正文

Vue組件通信的四種方式匯總

2019-11-19 14:23:44
字體:
來源:轉載
供稿:網友

前言

眾所周知vue是一種mvvm框架,它相對于jquery可能比較大的差異點之一就在于組件之間的通信了。本文重點是梳理了前兩個,父子組件通信和eventBus通信,我覺得Vue文檔里的說明還是有一些簡易,我自己第一遍是沒看明白。

  • 父子組件的通信
  • 非父子組件的eventBus通信
  • 利用本地緩存實現組件通信
  • Vuex通信

第一種通信方式:父子組件通信

父組件向子組件傳遞數據

父組件一共需要做4件事

      1.import son from './son.js' 引入子組件 son

      2.在components : {"son"} 里注冊所有子組件名稱

      3.在父組件的template應用子組件, <son></son>

      4.如果需要傳遞數據給子組件,就在template模板里寫 <son :num="number"></son>

 // 1.引入子組件  import counter from './counter' import son from './son'
// 2.在ccmponents里注冊子組件 components : { counter, son },
// 3.在template里使用子組件 <son></son>
 // 4.如果需要傳遞數據,也是在templete里寫 <counter :num="number"></counter>

子組件只需要做1件事

      1.用props接受數據,就可以直接使用數據

      2.子組件接受到的數據,不能去修改。如果你的確需要修改,可以用計算屬性,或者把數據賦值給子組件data里的一個變量

 // 1.用Props接受數據 props: [  'num'  ],
// 2.如果需要修改得到的數據,可以這樣寫 props: [  'num' ], data () { return {  number : this.num } },

子組件向父組件傳遞數據

父組件一共需要做2件事情

在template里定義事件

在methods里寫函數,監聽子組件的事件觸發

// 1. 在templete里應用子組件時,定義事件changeNumber <counter :num="number"   @changeNumber="changeNumber" > </counter>
// 2. 用changeNumber監聽事件是否觸發 methods: {  changeNumber(e){  console.log('子組件emit了',e);  this.number = e  }, }

子組件一共需要1件事情

在數據變化后,用$emit觸發即可

// 1. 子組件在數據變化后,用$emit觸發即可,第二個參數可以傳遞參數 methods: {  increment(){   this.number++   this.$emit('changeNumber', this.number)  }, }

第二種通信方式: eventBus

eventBus這種通信方式,針對的是非父子組件之間的通信,它的原理還是通過事件的觸發和監聽。

但是因為是非父子組件的關系,他們需要有一個中間組件來連接。

我是使用的通過在根組件,也就是#app組件上定義了一個所有組件都可以訪問到的組件,具體使用方式如下

使用eventBus傳遞數據,我們一共需要做3件事情

      1.給app組件添加Bus屬性 (這樣所有組件都可以通過this.$root.Bus訪問到它,而且不需要引入任何文件)

      2.在組件1里,this.$root.Bus.$emit觸發事件

      3.在組件2里,this.$root.Bus.$on監聽事件

// 1.在main.js里給app組件,添加bus屬性import Vue from 'vue'new Vue({ el: '#app', components: { App }, template: '<App/>', data(){ return { Bus : new Vue() } }})
// 2.在組件1里,觸發emitincrement(){ this.number++ this.$root.Bus.$emit('eventName', this.number) },
// 3.在組件2里,監聽事件,接受數據mounted(){ this.$root.Bus.$on('eventName', value => { this.number = value console.log('busEvent'); })},

第三種通信方式: 利用localStorage或者sessionStorage

這種通信比較簡單,缺點是數據和狀態比較混亂,不太容易維護。

通過window.localStorage.getItem(key) 獲取數據

通過window.localStorage.setItem(key,value) 存儲數據

注意:JSON.parse() / JSON.stringify() 做數據格式轉換。

第四種通信方式: 利用Vuex

Vuex比較復雜,可以單獨寫一篇

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 忻州市| 凉山| 工布江达县| 鄯善县| 汝阳县| 淳化县| 无极县| 兴安县| 黑河市| 蒲江县| 库伦旗| 兰考县| 四会市| 宜州市| 德安县| 敦化市| 静宁县| 东源县| 高雄市| 永济市| 荥阳市| 库伦旗| 曲阜市| 晋中市| 巧家县| 怀柔区| 永川市| 虎林市| 雷山县| 清镇市| 泾阳县| 恩施市| 商城县| 惠州市| 庆元县| 德令哈市| 德昌县| 泰兴市| 大关县| 高要市| 永顺县|