詳解Vue組件之間的數(shù)據(jù)通信實例
最近在用vue做項目,學(xué)習(xí)了不少東西,但是有時候光顧著做項目卻忘記要找個時間來整理一下最近的一些學(xué)習(xí)新得,因為是新手,所以可能會有錯誤的地方,歡迎指出和交流呀~~~
關(guān)于父子組件以及非父子組件之間的數(shù)據(jù)通信
1 父子組件之間數(shù)據(jù)通信
一般父組件向子組件傳遞數(shù)據(jù)用prop進(jìn)行傳遞,注意,子組件不能對prop中的數(shù)據(jù)進(jìn)行更改,vue中規(guī)定是防止子組件對父組件中的數(shù)據(jù)進(jìn)行竄改。而子組件向父組件進(jìn)行數(shù)據(jù)傳遞則可以通過事件觸發(fā)父組件的事件來實現(xiàn)數(shù)據(jù)的傳遞。(是不是有點懵逼了,看個例子吧 )
(這里我就直接摘取一段項目中的例子代碼來說明)
使用prop進(jìn)行數(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ù)屬性;
當(dāng)然,子組件做完相關(guān)操作之后,需要時間的是將屬性值dialogFormVisible重新修改為false。若是直接在子組件進(jìn)行修改的話,就會報錯,因為會影響到父組件的數(shù)據(jù),vue中規(guī)定不能直接對prop的屬性值進(jìn)行修改。那么就可以用事件觸發(fā)來實現(xiàn)子組件向父組件傳遞數(shù)據(jù)了。
///父組件監(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的值;
//這里我會在每一次組件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)該是暫時還不會用到,所以以后用到再去深入了解。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue 動態(tài)添加/刪除dom元素節(jié)點的操作代碼
這篇文章主要介紹了vue 動態(tài)添加/刪除dom元素,需要在點擊添加時,增加一行key/value的輸入框;點擊垃圾桶圖標(biāo)時,刪除對應(yīng)行,本文結(jié)合實例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-12-12