Vue 組件間通信有哪幾種方式

Vue 組件間通信主要指以下 3 類通信:父子組件通信、隔代組件通信、兄弟組件通信

1.props / $emit 適用 父子組件通信

props是父組件將值傳給子組件,$emit是子組件通過派發(fā)事件的方式將值傳給父組件

2.ref$parent / $children 適用 父子組件通信

1)ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子組件上,引用就指向組件實例

2)$parent / $children :訪問父、子實實例,需要注意的是:
children是一個數(shù)組,因為子組件可能有多個,通過parent和$children可以直接修改父子組件的data

Parent.vue

<Child />
<Child />
<Child />
{
   data(){
     return {
       parentMsg:'parent'
     }
   },
  mounted(){
   this.$children[0].childMsg = 'changed'
  }
}

Child

{
   data(){
     return {
       childMsg:'child'
     }
   },
   mounted(){
     this.$parent.parentMsg = 'changed'
   }
}

3.EventBus ($emit/$on) 適用于 父子、隔代、兄弟組件通信

這種方法通過一個空的 Vue 實例作為中央事件總線(事件中心),用它來觸發(fā)事件和監(jiān)聽事件,從而實現(xiàn)任何組件間的通信,包括父子、隔代、兄弟組件:

使用EventBus我們需要實例化一個空的不具備DOM的Vue,為方便使用,可以把其掛在項目將實例的Vue的原型上

main.js

Vue.prototype.$EventBus = new Vue()

CompnentA

{
   methods:{
     testA(){
       this.$EventBus.$emit('cmaFunction',params)
     }
   }
}

ComponentB

{
   mounted(){
     this.$EventBus.$on('cmaFunction',(params)=>{
       console.log(params)
     })
   }
}

4.$attrs/$listeners 適用于 隔代組件通信

  • attr包含了父作用域中不作為prop被識別(且獲取)的特性綁定(class和style除外),并且可以通過v?bind="
    attrs"繼續(xù)向下傳遞,通常配合 inheritAttrs 選項一起使用(inheritAttrs=true的時候,傳遞的屬性會加到子組件的根元素上)

例如:
Parent.vue

<Child name="jack" age="18" weight="135">

Child.vue

/可以將$attrs繼續(xù)傳向后代組件
<GrandSon v-bind="$attrs">

{
   props:['weight'],
   mounted(){
   //這里'weight'已經(jīng)被作為props識別了,所以¥attrs上不再包含weight屬性
     console.log(this.$attrs) // {name:'jack',age:'18'}
   }
}

GrandSon.vue

{
   mounted(){
     console.log(this.$attrs)  //{name:'jack',age:'18'}
   }
}
  • listeners:包含了父作用域中的(不含.native修飾器的)v?on事件監(jiān)聽器。它可以通過v?on="
    listeners" 傳入內(nèi)部組件

例如:
Parent.vue

<Child v-on:click="myClick">

Child.vue

//可以將$attrs繼續(xù)傳向后代組件
<GrandSon v-bind="$listeners">

{
   mounted(){
     console.log(this.$listeners) // {name:'jack',age:'18'}
   }
}

GrandSon.vue

{
   mounted(){
     console.log(this.$listeners)  //{name:'jack',age:'18'}
   }
}

5.provide / inject 適用于 隔代組件通信

祖先組件中通過 provider 來提供變量,然后在子孫組件中通過 inject 來注入變量。 provide / inject API 主要解決了跨級組件間的通信問題,不過它的使用場景,主要是子組件獲取上級組件的狀態(tài),跨級組件間建立了一種主動提供與依賴注入的關系。

Parent.vue

{
    provide:{
        foo:'bar'
    }
}

GrandSon.vue

{
    inject:['foo'],
    mounted(){
        console.log(this.foo) // bar
    }
}

6.Vuex 適用于 父子、隔代、兄弟組件通信

Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式。每一個 Vuex 應用的核心就是 store(倉庫)?!皊tore” 基本上就是一個容器,它包含著你的應用中大部分的狀態(tài) ( state )。

  • Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式。每一個 Vuex 應用的核心就是 store(倉庫)?!皊tore” 基本上就是一個容器,它包含著你的應用中大部分的狀態(tài) ( state )。

  • 改變 store 中的狀態(tài)的唯一途徑就是顯式地提交 (commit) mutation。這樣使得我們可以方便地跟蹤每一個狀態(tài)的變化

vuex主要包括以下幾個模塊:

  • State:定義了應用狀態(tài)的數(shù)據(jù)結構,可以在這里設置默認的初始狀態(tài)。
  • Getter:允許組件從 Store 中獲取數(shù)據(jù),mapGetters 輔助函數(shù)僅僅是將 store 中的 getter 映射到局部計算屬性。
  • Mutation:是唯一更改 store 中狀態(tài)的方法,且必須是同步函數(shù)。
  • Action:用于提交 mutation,而不是直接變更狀態(tài),可以包含任意異步操作
  • Module:允許將單一的 Store 拆分為多個 store 且同時保存在單一的狀態(tài)樹中。
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容