Vue組件通信實踐記錄(推薦)
組件通信
幾乎所有的mvvm框架中都要涉及組件通信的功能(吐槽一下knockout,畢竟是鼻祖就先不說它了)。而且目前的前端形式來看,組件化是一個項目的基礎(chǔ)。所以選好一個合適的框架后,隨著組件的不斷增加,業(yè)務(wù)的復(fù)雜度提升,組件之間的通信變得尤為重要。
實踐方法
由于更換新的框架,我們的項目由Avalon更新成Vue.但是為了兼容以前的業(yè)務(wù)代碼,不能直接使用vue的標準實踐方式,我還是拿過來后封裝了一個vue的class,具體業(yè)務(wù)里面不影響使用,封裝的過程之后寫出來再聊吧,下面來總結(jié)一下最近用到的通信實踐方法。
1.父組件是通過props傳遞數(shù)據(jù)給子組件
vmodel 中包含了兩個子組件
<div class="w-base"> <book-component v-bind:bookdata="book"></book-component> </div> <div class="base"> <node-component v-bind:catalog="catalog" ></node-component> </div>
在上面這段代碼中我們可以看到,定義了兩個子組件,并且使用指定v-bind指令傳遞了數(shù)據(jù),子組件會接收到傳遞的數(shù)據(jù)。
Vue.component('book-component', {
template: tpl,//可以傳進來子組件的模板文件
props: ['book'],
data: function () {
return { myBook: this.bookdata }
}
})
建議接收到單向的props數(shù)據(jù)后,定義一個局部變量來初始化使用。
2.父組件與子組件之間通信的其他方式
vue中給實例提供了三個我們可用的API $children 和 $refs 以及 $parent 。
$children :當(dāng)前實例的直接子組件。需要注意 $children 并不保證順序,也不是響應(yīng)式的。
$refs :包含了當(dāng)前實例所有擁有 ref 注冊的子組件的對象.
$parent : 當(dāng)前實例的父實例。
所以說,如果在通信方面我們我組件想要調(diào)用子組件,能用的方法只有 $refs 了,因為 $children 是一個數(shù)組,并且不保證順序,也沒有相關(guān)的id去尋找我們需要的那個特定子組件。但是如果使用 $refs 去尋找特定子組件,那就必須要給那個子組件注冊 ref 。
父組件的模版
<!-- vm.$refs.child will be the child comp instance --> <child-component ref="child"></child-comp>
父組件
//找到子組件并且調(diào)用它的方法 var myChild = this.$refs.child; mymyChild.func();
子組件
//找到父組件并且調(diào)用它的方法 var myParent = this.$parent; mymyChild.func();
3.平行組件之間的兩種通信方式
a.官方提供的事件bus
var bus = new Vue()
// 觸發(fā)組件 A 中的事件
bus.$emit('id-selected', 1)
// 在組件 B 創(chuàng)建的鉤子中監(jiān)聽事件
bus.$on('id-selected', function (id) {
// ...
})
b.通過父組件去找兄弟組件
//找到父組件的$refs對象,然后找到組件的兄弟組件
var $refs = this.$parent?this.$parent.$refs:{};
var childComponent = $refs.child; //child為改組件的ref屬性值
其實以上兩種方法最好的實踐方式是封裝到項目的基類中,這樣不用每次都去定義一個空Vue()實例,而是每個實例的基類中都有這個事件bus。同樣可以封裝找到其他兄弟組件的方法,但是該兄弟組件必須注冊ref
下面這個方法是我在項目中封裝的用于找到父組件,然后再去找到兄弟組件的方法。
//平行組件之間的通信
getComponentByRef: function(refId) {
var $refs = this.$parent?this.$parent.$refs:{};
for (var $id in $refs) {
if ($id == refId) {
return $refs[$id];
}
}
return null;
}
使用
//在組件中直接使用
this.getComponentByRef("booknode").updateNode(this.node);
4.組件間復(fù)雜數(shù)據(jù)通信Vuex
一說到vuex,很多剛開始接觸vue的人會主動避免去使用它,其實它并沒有想象中的那么復(fù)雜。最好的開始是引入vuex后,走一遍給出的小示例。但是如果你的項目并不復(fù)雜的話,可以不考慮狀態(tài)管理,那么什么時候需要使用狀態(tài)管理呢?
我們來看這樣一個布局

如果component1中的某個數(shù)據(jù)變更,那么com2,com3也要跟著更新,此時com3中又細分為了三個小組件。
問題:
- 多個試圖依賴同一個狀態(tài)
- 多層嵌套的組件,數(shù)據(jù)變更和代碼維護困難
那這樣的情況時,我們可以考慮使用狀態(tài)管理。下一篇文章將詳細講解關(guān)于vuex的實踐和理解。
寫在最后的總結(jié)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用 Vue 3 的 createApp方法初始化應(yīng)用的基本步驟
createApp 是 Vue 3 引入的全局 API,用于創(chuàng)建一個應(yīng)用實例,這篇文章主要介紹了如何使用 Vue 3 的 createApp方法初始化應(yīng)用,通過 createApp 方法,我們從 Vue 3 的基本初始化開始,擴展到插件的應(yīng)用、多個應(yīng)用實例的創(chuàng)建等,需要的朋友可以參考下2024-05-05
Vue中登錄驗證成功后保存token,并每次請求攜帶并驗證token操作
這篇文章主要介紹了Vue中登錄驗證成功后保存token,并每次請求攜帶并驗證token操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
解決VUE項目使用Element-ui 下拉組件的驗證失效問題
這篇文章主要介紹了解決VUE項目使用Element-ui 下拉組件的驗證失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
intellij?idea+vue前端調(diào)試配置圖文教程
在Vue項目開發(fā)過程中,當(dāng)遇到應(yīng)用邏輯出現(xiàn)錯誤,但又無法準確定位的時候,知曉Vue項目調(diào)試技巧至關(guān)重要,debug是必備技能,這篇文章主要給大家介紹了關(guān)于intellij?idea+vue前端調(diào)試配置的相關(guān)資料,需要的朋友可以參考下2024-09-09
vue+uniapp瀑布流布局多種實現(xiàn)方式示例代碼
由于使用uniapp開發(fā)的微信小程序不需要考慮響應(yīng)式,因此瀑布流的實現(xiàn)相對于pc端更為簡單,下面這篇文章主要給大家介紹了關(guān)于vue+uniapp瀑布流布局多種實現(xiàn)方式的相關(guān)資料,需要的朋友可以參考下2023-03-03
Vue3子組件watch無法監(jiān)聽父組件傳遞的屬性值的解決方法
這篇文章主要介紹了Vue3子組件watch無法監(jiān)聽父組件傳遞的屬性值的解決方法,文中通過代碼示例講解的講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-10-10

