Vue組件之間的數(shù)據(jù)通信

最近在用vue做項目敦迄,學(xué)習(xí)了不少東西钠怯,但是有時候光顧著做項目卻忘記要找個時間來整理一下最近的一些學(xué)習(xí)新得佳魔,因為是新手,所以可能會有錯誤的地方呻疹,歡迎指出和交流呀~~~

關(guān)于父子組件以及非父子組件之間的數(shù)據(jù)通信
組件之間數(shù)據(jù)通信.png

1 父子組件之間數(shù)據(jù)通信

一般父組件向子組件傳遞數(shù)據(jù)用prop進行傳遞吃引,注意,子組件不能對prop中的數(shù)據(jù)進行更改刽锤,vue中規(guī)定是防止子組件對父組件中的數(shù)據(jù)進行竄改镊尺。而子組件向父組件進行數(shù)據(jù)傳遞則可以通過事件觸發(fā)父組件的事件來實現(xiàn)數(shù)據(jù)的傳遞。(是不是有點懵逼了并思,看個例子吧 )

(這里我就直接摘取一段項目中的例子代碼來說明)

使用prop進行數(shù)據(jù)傳遞:

//這是父組件中的部分代碼庐氮,父組件向子組件<handle-Employee><handle-Employee>傳遞數(shù)據(jù)(method,dialogFormvisible)
 // 父組件的部分代碼
<!--添加員工模塊-->
      <div class="add">
        <el-button type="primary" icon="edit"  @click="handleAdd">新增員工</el-button>
        <handle-Employee :method="method"
         :dialogFormVisible="dialogFormVisible" @close="closeDialog" @getEmployee="getEmployee"></handle-Employee>
      </div>
    </div>
// 父組件的script代碼
  export default {
    data () {
      return {
        method:{handle: ’add‘, title: '增加員工'}
        dialogFormvisible: false
  }
 } 
}

// 子組件中則需要加prop屬性數(shù)據(jù) ,如下所示:
  export default {
     props: [ 'method', 'dialogFormVisible']
  }

//所以只要父組件中的數(shù)據(jù)變化修改宋彼,子組件中的數(shù)據(jù)也會跟這修改弄砍;

在chrome中用vue-devtool其實也可以看到相關(guān)的數(shù)據(jù)屬性;

prop數(shù)據(jù)通信.png

當(dāng)然输涕,子組件做完相關(guān)操作之后音婶,需要時間的是將屬性值dialogFormVisible重新修改為false。若是直接在子組件進行修改的話莱坎,就會報錯衣式,因為會影響到父組件的數(shù)據(jù),vue中規(guī)定不能直接對prop的屬性值進行修改檐什。那么就可以用事件觸發(fā)來實現(xiàn)子組件向父組件傳遞數(shù)據(jù)了碴卧。

image.png
///父組件監(jiān)聽子組件的事件,通過@close="closeDialog"和@getEmployee="getEmployee"來實現(xiàn)監(jiān)聽乃正;
一旦子組件中的事件close和getEmployee發(fā)生之后住册,就會觸發(fā)父組件中的事件closeDialog和getEmployee事件。
// 父組件的部分代碼
<div class="add">
   <el-button type="primary" icon="edit"  @click="handleAdd">新增員工</el-button>
    <handle-Employee  :method="method" :dialogFormVisible="dialogFormVisible" @close="closeDialog" ></handle-Employee>
</div>

//子組件中的事件分發(fā) 
export default {
methods: {
  // 關(guān)閉彈出框
      closeDialog () {
        this.$emit('close', false)   //這里就是直接觸發(fā)子組件的close事件瓮具,一旦這個執(zhí)行荧飞,父組件中的對應(yīng)方法就會執(zhí)行。
      }
}
}
//  當(dāng)那邊觸發(fā)關(guān)閉事件的時候搭综,這邊的顯示值就要關(guān)閉垢箕,那邊會傳過來一個false
    
//  父組件的事件
export default {
methods: {
  //  當(dāng)那邊觸發(fā)關(guān)閉事件的時候,這邊的顯示值就要關(guān)閉兑巾,那邊會傳過來一個false
   closeDialog (val) {
        this.dialogFormVisible = val
      }
}
}

這樣就實現(xiàn)了父子組件之間的數(shù)據(jù)傳遞条获;

2 實現(xiàn)非父子組件之間的數(shù)據(jù)傳遞

通過建立中間的事件bus總線。實現(xiàn)非父子組件之間的數(shù)據(jù)通信蒋歌。

  • 首先建立事件bus帅掘,我會新建一個bus.js文件委煤;注冊bus。
  • 分別在組件中使用emit和on實現(xiàn)數(shù)據(jù)之間的通信修档;

1 bus.js文件

//bus.js碧绞,注冊Bus
import Vue from 'vue'
export default new Vue()

2 組件emit觸發(fā)事件

<template>
 <div class="add-task" :class="{'ishide':isAdding}"  @click="addtask()">
   <i class="fa fa-plus-circle" aria-hidden="true"></i>
   添加任務(wù)
 </div>
</template>
<script>
 import Bus from '@/bus'
 export default {
 methods: {
props: ['index'],
   data () {
     return {
       isAdding: false
     }
   },
     addtask () {
       this.isAdding = true
       Bus.$emit('adding-task', this.isAdding, this.index)  // 這里觸發(fā)的事件是'adding-task',
       傳遞了兩個參數(shù)吱窝,分別是this.isAdding和this.index
       this.$emit('addtask')
     }
   }
 }

3 另外一個組件on接收事件

// 模板中的代碼就不展示了讥邻。
主要展示的是script中的代碼
export default{
data() //  這里的數(shù)據(jù)也不一一顯示啦;
created () {
// 這里使用on監(jiān)聽了adding-task事件院峡,接收到兩個參數(shù)兴使。所以一旦上面的組件中的adding-task事件觸發(fā),這里就會監(jiān)聽到照激。
    Bus.$on('adding-task', (state, index) => {
      if (this.index === index) {
        this.isShow = state
      }
    })
  }
}

缺點:
有時候小的子組件在頁面中有很多個发魄,需要復(fù)用,那么為了防止每一次觸發(fā)相應(yīng)的事件的時候俩垃,都會影響到監(jiān)聽的對應(yīng)組件励幼,如下圖所示。我的解決方案就是給每一個循環(huán)的子組件賦值一個index的值口柳;

image.png
//這里我會在每一次組件emit的時候傳遞一個index的值苹粟,另外一個組件on之后接受參數(shù),會先判斷該index是不是與自己的index相等,如果相等才執(zhí)行相應(yīng)的數(shù)據(jù)改變操作。
  Bus.$on('adding-task', (state, index) => {
        if (this.index === index) {
          this.isShow = state
        }

今天先到這里烟阐,困了墓卦。還有更復(fù)雜的數(shù)據(jù)通信是用vuex,不過我現(xiàn)在的項目應(yīng)該是暫時還不會用到睛榄,所以以后用到再去深入了解荣茫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市场靴,隨后出現(xiàn)的幾起案子啡莉,更是在濱河造成了極大的恐慌,老刑警劉巖旨剥,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咧欣,死亡現(xiàn)場離奇詭異,居然都是意外死亡轨帜,警方通過查閱死者的電腦和手機魄咕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚌父,“玉大人哮兰,你說我怎么就攤上這事毛萌。” “怎么了喝滞?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵阁将,是天一觀的道長。 經(jīng)常有香客問我右遭,道長做盅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任窘哈,我火速辦了婚禮吹榴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宵距。我一直安慰自己腊尚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布满哪。 她就那樣靜靜地躺著婿斥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哨鸭。 梳的紋絲不亂的頭發(fā)上民宿,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音像鸡,去河邊找鬼活鹰。 笑死,一個胖子當(dāng)著我的面吹牛只估,可吹牛的內(nèi)容都是我干的志群。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蛔钙,長吁一口氣:“原來是場噩夢啊……” “哼锌云!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吁脱,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤桑涎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兼贡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攻冷,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年遍希,在試婚紗的時候發(fā)現(xiàn)自己被綠了等曼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涉兽,靈堂內(nèi)的尸體忽然破棺而出招驴,到底是詐尸還是另有隱情,我是刑警寧澤枷畏,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布别厘,位于F島的核電站,受9級特大地震影響拥诡,放射性物質(zhì)發(fā)生泄漏触趴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一渴肉、第九天 我趴在偏房一處隱蔽的房頂上張望冗懦。 院中可真熱鬧,春花似錦仇祭、人聲如沸披蕉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽没讲。三九已至,卻和暖如春礁苗,著一層夾襖步出監(jiān)牢的瞬間爬凑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工试伙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘁信,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓疏叨,卻偏偏與公主長得像潘靖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚤蔓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 序 今年大前端的概念一而再再而三的被提及秘豹,那么大前端時代究竟是什么呢?大前端這個詞最早是因為在阿里內(nèi)部有很多前端開...
    一縷殤流化隱半邊冰霜閱讀 11,227評論 19 92
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容昌粤,還有我對于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,046評論 0 29
  • 此文基于官方文檔啄刹,里面部分例子有改動涮坐,加上了一些自己的理解 什么是組件? 組件(Component)是 Vue.j...
    陸志均閱讀 3,807評論 5 14
  • 小王和工長干起來了誓军,這讓有人不平袱讹,有人開心,有人湊熱鬧捷雕。在哪里都不缺看熱鬧的,我還是湊著看了一會壶熏,為了安慰自己...
    九月的一只貓閱讀 327評論 0 1
  • 每次在學(xué)刑厩危總會聽到很多講座粘驰,有企業(yè)家分享,有知名人士演講等等康嘉。幾乎每場演講都是有提問環(huán)節(jié)亭珍,然而,觀眾的問題很多都是...
    我是劉良閱讀 703評論 0 0