父元件向子元件傳遞資料,直接使用prop
即可,父元件中在子元件的例項上通過v-bind
傳入prop
:
在子元件中宣告了這個prop
之後就可以使用:
子元件向父元件可以直接通過$emit
元件上的事件來進行通訊,例如在父元件中,通過v-on
為子元件傳入乙個事件:
子元件中通過#emit
來觸發傳入的自定義事件,以引數的形式將資料傳遞給父元件:
非父子元件的通訊有幾種解決方案,如果是比較複雜的應用,可以直接使用vuex來實現通訊和資料管理,如果不使用vuex則可以使用下面幾種方法來實現元件通訊。
原理就是通過乙個空的vue例項eventbus
,a元件首先在eventbus
上通過$on
訂閱乙個事件,然後在元件b中通過$emit
發布乙個事件,在事件中將資料進行傳遞。
首先在乙個單獨的檔案中定義名稱為eventbus
的vue例項,並匯出這個例項
// eventbus.js
import vue from 'vue';
export default new vue()
在元件a引入eventbus
後,在eventbus
上訂閱乙個事件getvalue
,最好在元件銷毀前登出監聽的事件:
// 元件a
import eventbus from './eventbus';
export default )
},beforedestroy() ,
}
然後在元件b中也引入eventbus
後,藉由eventbus
發布getvalue
事件,並將資料作為第二個引數傳遞給事件的訂閱者:
// 元件b
import eventbus from './eventbus';
export default
},}
上面這種方式,在每個需要通訊的元件都需要手動引入eventbus
,很麻煩。所以希望能夠做到一次注入,到處使用。
改進的方法就是在main.js
中定義vue根例項時,將eventbus
新增到根例項的data
中,然後再每個元件中都可以通過this.#root.eventbus
來訪問它:
// main.js
new vue(,
});
在元件a使用$root.eventbus.$on
來訂閱事件:
// 元件a
export default )
},beforedestroy() ,
}
在元件b中使用$root.eventbus.$on
來發布事件:
// 元件b
import eventbus from './eventbus';
export default
},}
vue物件本質上就是乙個js物件,想要引入eventbus
只需要在vue的原型prototype
上增加乙個屬性就可以了。本質上所有的vue元件都是繼承全域性的vue,所以只要在初始化vue物件之前在prototype
上定義屬性,這樣所有的元件都可以訪問這個屬性了。
所以在main.js
中,在例項化vue之前增加**
// main.js
// 在例項化vue例項之前
vue.prototype.$eventbus = vue.prototype.$eventbus || new vue();
元件a中
// 元件a
this.$eventbus.$on('getvalue', value => {})
元件b中
// 元件b
this.$eventbus.$emit('getvalue', 'message')
vue的2.6版本新增了乙個vue.observale
,它可以定義乙個可響應的物件,實際上vue內部會用它來處理data
函式返回的物件。
這個api返回的物件可以直接用於渲染函式和計算屬性內,並且在發生改變時觸發相應的更新,可以作為最小化的跨元件狀態儲存器,用於簡單的場景。
我們新建乙個******store.js
,匯出乙個使用vue.observale
處理後的物件:
// ******store.js
import vue from 'vue';
export default vue.observable()
然後再main.js
中作為vue的根例項的data
的屬性匯入(也可以根據元件通訊的範圍,分別在不同的元件匯入,比如作為元件的資料處理層時):
// main.js
import ******store from './******store'
new vue(,
});
這樣在需要通訊的元件中就可以直接修改這個變數,在另外乙個元件中通過計算屬性引入這個變數,就可以實現響應式的更新:
元件a中直接修改這個變數:
// 元件a
export default
},}
元件b中通過計算屬性引入這個變數:
// 元件b
export default
}}
實際上在******store.js
中我們可以繼續定義commit
、action
、mutation
、dispatch
等事件,來統一管理變數的修改,實際上就是自己實現了乙個簡易的vuex
在使用vue.observable
時,有兩點需要注意:
(1)vue.observable
返回的物件只能用於渲染函式或者計算屬性內,才能實現響應式的更新,不能直接用於data
函式中賦值
const state = vue.observable()
const demo = }
}, `count is: $`)
}}
(2)在vue 2.x中,被傳入的物件會直接被vue.observable
改變,它和被返回的物件是同乙個物件。但是在vue 3.x中,則會返回乙個可響應的**,而對源物件直接進行修改仍是不可相應的。因此為了相容性,應該始終操作vue.observable
返回的物件,而不是傳入的源物件。 Vue 二 元件間通訊
父元件中定義元素 如job 初始化 data 資料 data function 父元件中子元件標籤中定義並繫結資料 如 job job 等號左邊屬性名需和子元件定義 呼叫的寫法一樣,右邊表示父元件中的資料元素 name name job job namewasreset name event res...
VUE 元件(二)元件通訊
元件關係可分為父子元件通訊 兄弟元件通訊 跨級元件通訊。一 自定義事件 當子元件向父元件傳遞資料時,就要用到自定義事件 子元件用 emit 來觸發事件,父元件用 on 來監聽子元件事件 通過兩個按鈕實現 1 1的效果,在改變元件data中的count後,通過 emit 將值傳給父元件,父元件用v o...
Vue2 元件間通訊全方案
說的不對的,敬請諒解,大家共同討論進步 元件通訊包括 父子元件間的通訊和兄弟元件間的通訊。在元件化系統構建中,元件間通訊必不可少的。父元件關鍵 如下 子元件關鍵 如下 export default child msg 為父元件給子元件設定的額外屬性值,屬性值需在子元件中設定props,子元件中可直接...