vue組件之間的多種通信方法

vue是一種mvvm框架杯缺,它相對于jquery可能比較大的差異點之一就在于組件之間的通信了。這里提供三種不同情況下vue組件的通信方式匿醒。

一. vue父子組件通信

vue父子組件通信可以用Vue.$emit自定義事件來解決场航。

// 父組件
<single-address @edit-address="editAddress"></single-address>
// 子組件
methods: {
 editAddress () {
  this.$emit('edit-address', false)
 }
}

當然也可以使用props方式解決。

// 父組件
<one-address :addressitems="addressitems"></one-address>
// 子組件
<div>{{ addressitems.partment }}{{ addressitems.address }}</div>
export default {
  props: {
    addressitems: Object
  }
}

二. 非父子組件通信

非父子組件通信同樣也可以用Vue.$emit自定義事件來解決

var bus = new Vue()
// 組件A
bus.$emit('id-selected', 1)
// 組件B
bus.$on('id-selected', function (id) {
 console.log(id)
})

三. vue跨組件跨模塊通信

雖然父子組件廉羔,非父子組件間的通信vue都可以有辦法解決溉痢,但是如果項目結(jié)構(gòu)復雜化以后,這樣的自定義事件變多以后代碼難以管理,所以還是建議使用vuex孩饼。
接下來就講一講vuex這個東西吧髓削。vuex,官方的說法就是Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式镀娶。如果之前沒有接觸過應用狀態(tài)管理這一塊的內(nèi)容的話立膛,可能光看文檔是很難看明白的。按個人的理解來說梯码,vuex最大的作用就是把部分父子組件之間頻繁的通信過程簡單化宝泵,所以,對于一些父子組件通信并不頻繁的情況來說轩娶,并不應該使用vuex儿奶,當然這也意味著,如果你對父子組件之間的通信還不是很明確的話鳄抒,可以先學習一下這一塊的知識闯捎。
vuex有四個核心概念,其中state和getters主要是用于數(shù)據(jù)的存儲與輸出嘁酿,而mutations和actions是用于提交事件并修改state中的數(shù)據(jù)隙券。
也是以購物車的業(yè)務來舉例男应,首先由于vue的限制闹司,頁面中所有的數(shù)據(jù)都需要一個初始化,這樣才能在之后業(yè)務邏輯中響應式地修改數(shù)據(jù)(修改數(shù)據(jù)的同時變化頁面內(nèi)容)沐飘。這里我們可以在vue組件中使用ajax獲取數(shù)據(jù)游桩,獲取到的數(shù)據(jù)直接賦給state中的數(shù)據(jù):

// global.Domain.centerUrl是我自己定義的全局變量,這種就可以更方便的管理前端數(shù)據(jù)請求接口的地址了
      getDataFromBackend () {
        this.$http({
          method: 'get',
          url: global.Domain.centerUrl + 'order'
        }).then(function (response) {
          let res = response.data
          // state.order是因為我對整個應用進行了分模塊的設(shè)計耐朴,order是我其中的一個模塊借卧,后面會講如何劃分模塊
          // $store是vue實例的全局屬性,這個屬性可以直接獲取vuex狀態(tài)樹中的所有state數(shù)據(jù)
          this.$store.state.order.orderitems = res.orderitems
        })
      }

getters的用法與計算屬性基本一致筛峭,computed會用的話那這個也基本就會用了铐刘。
接下來就是重頭戲mutations了。mutations原意是突變影晓,這里可以理解為立即修改吧镰吵。也就是說,mutations可以修改state中的數(shù)據(jù)挂签,但是有一個限制疤祭,那就是只能同步修改,而不能異步饵婆,你想要按個定時器過2秒鐘修改state勺馆,那對不起了您哪,不行。但是草穆,想要異步修改state灌灾,也不是不行,光靠mutations一個人是不行的了悲柱,還得要靠actions紧卒,而且actions還不能直接操作state,他需要異步提交給mutations诗祸,然后再由mutations同步修改state數(shù)據(jù)跑芳。聽上去挺麻煩的一件事情啊,還是直接看代碼吧直颅。

  mutations: {
    correctIfcollect (state) {
      state.ifcollectwrap = true
    },
    modifyIfcollect (state) {
      state.ifcollectwrap = false
    },
    // 收藏成功事件
    collectSuccess (state) {
      state.ifcollect = true
      state.collectmsg = '收藏成功'
    },
    // 取消收藏事件
    collectCancel (state) {
      state.ifcollect = false
      state.collectmsg = '取消收藏'
    }
  },
  actions: {
    // actions有一個必要的參數(shù)commit博个,用于提交事件到mutations中
    collectPopup ({commit, state}) {
      let oTimer = ''
      clearTimeout(oTimer)
      if (!state.ifcollect) {
        commit('collectSuccess')
        commit('correctIfcollect')
        oTimer = setTimeout(function () {
          commit('modifyIfcollect')
        }, 2000)
      } else {
        commit('collectCancel')
        commit('correctIfcollect')
        oTimer = setTimeout(function () {
          commit('modifyIfcollect')
        }, 2000)
      }
    }
  }
    // 假如有數(shù)據(jù)需要從組件傳到actions中時,需要兩個大括號功偿,第一個大括號放commit或者state這類vuex參數(shù)盆佣,而第二個大括號放傳進來的參數(shù)
    // 這里使用vuex actions調(diào)用了兩個mutations的方法實現(xiàn)一個功能,是因為第二個函數(shù)中有一個參數(shù)是需要第一個函數(shù)提供的
    changePos ({commit}, {index}) {
      commit('changeHandle', index)
      commit('changePos', index)
    }

總的來說械荷,在我看懂了vuex以后共耍,我總是覺得有一個vuex來分擔一下data的功能那是再好不過了,這樣不光能夠更好地管理我的應用吨瞎,同時也能夠提高我.vue單文件的可讀性痹兜。
那么這里就有一個問題了,我們都知道一個稍微大一點的項目颤诀,那數(shù)據(jù)量都是很多的字旭,如果整個項目里的數(shù)據(jù)都寫在一個vuex文件里的話就顯得整個文件太大太重了,這與我們想要提高文件的可讀性是相悖的崖叫。所以我們需要有一個分模塊的意識來管理vuex遗淳,管理應用的狀態(tài)。
而vuex也正好提供了這個功能(vuex還真的是夠強大)心傀,在具體使用的過程中屈暗,我會先把那些需要與其他組件交互的組件中的數(shù)據(jù)都提取出來放到vuex里面管理,而那些完全沒有交互的數(shù)據(jù)還是放在組件的data中脂男,例如標識該組件的標題數(shù)據(jù)等等养叛。然后,這里我們就可以用到vuex的模塊管理功能疆液,愉快地把數(shù)據(jù)按照組件之間的功能聯(lián)系來分離一铅,并把它們拆分到一個個小文件中啦。

// 這是vuex總的管理文件堕油,將各模塊統(tǒng)一在一起潘飘,從而將每一個分支都連接到vuex這個總的狀態(tài)樹上
// 引入vue
import Vue from 'vue'
// 引入vuex
import Vuex from 'vuex'
// 引入應用狀態(tài)管理
import goodshandleStore from './goodshandle'
import orderStore from './order'
import addressStore from './address'
import shopcarStore from './shopcar'
import merchantStore from './merchant'
import couponStore from './coupon'

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    handle: goodshandleStore,
    order: orderStore,
    address: addressStore,
    shopcar: shopcarStore,
    merchant: merchantStore,
    coupon: couponStore
  }
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肮之,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卜录,更是在濱河造成了極大的恐慌戈擒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艰毒,死亡現(xiàn)場離奇詭異筐高,居然都是意外死亡,警方通過查閱死者的電腦和手機丑瞧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門柑土,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绊汹,你說我怎么就攤上這事稽屏。” “怎么了西乖?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵狐榔,是天一觀的道長。 經(jīng)常有香客問我获雕,道長薄腻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任届案,我火速辦了婚禮庵楷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萝玷。我一直安慰自己嫁乘,他們只是感情好昆婿,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布球碉。 她就那樣靜靜地躺著,像睡著了一般仓蛆。 火紅的嫁衣襯著肌膚如雪睁冬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天看疙,我揣著相機與錄音豆拨,去河邊找鬼。 笑死能庆,一個胖子當著我的面吹牛施禾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搁胆,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼弥搞,長吁一口氣:“原來是場噩夢啊……” “哼邮绿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起攀例,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤船逮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粤铭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挖胃,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年梆惯,在試婚紗的時候發(fā)現(xiàn)自己被綠了酱鸭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡垛吗,死狀恐怖凛辣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情职烧,我是刑警寧澤扁誓,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站蚀之,受9級特大地震影響蝗敢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜足删,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一寿谴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧失受,春花似錦讶泰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兄旬,卻和暖如春狼犯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背领铐。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工悯森, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绪撵。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓瓢姻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親音诈。 傳聞我的和親對象是個殘疾皇子幻碱,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容