Vue 组件间通信有哪几种方式

Vue 组件间通信主要指以下 3 类通信:父子组件通信、隔代组件通信、兄弟组件通信

1.props / $emit 适用 父子组件通信

props是父组件将值传给子组件,$emit是子组件通过派发事件的方式将值传给父组件

2.ref$parent / $children 适用 父子组件通信

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

2)$parent / $children :访问父、子实实例,需要注意的是:
children是一个数组,因为子组件可能有多个,通过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 实例作为中央事件总线(事件中心),用它来触发事件和监听事件,从而实现任何组件间的通信,包括父子、隔代、兄弟组件:

使用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"继续向下传递,通常配合 inheritAttrs 选项一起使用(inheritAttrs=true的时候,传递的属性会加到子组件的根元素上)

例如:
Parent.vue

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

Child.vue

/可以将$attrs继续传向后代组件
<GrandSon v-bind="$attrs">

{
   props:['weight'],
   mounted(){
   //这里'weight'已经被作为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事件监听器。它可以通过v−on="
    listeners" 传入内部组件

例如:
Parent.vue

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

Child.vue

//可以将$attrs继续传向后代组件
<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 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。

Parent.vue

{
    provide:{
        foo:'bar'
    }
}

GrandSon.vue

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

6.Vuex 适用于 父子、隔代、兄弟组件通信

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。

  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。

  • 改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化

vuex主要包括以下几个模块:

  • State:定义了应用状态的数据结构,可以在这里设置默认的初始状态。
  • Getter:允许组件从 Store 中获取数据,mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性。
  • Mutation:是唯一更改 store 中状态的方法,且必须是同步函数。
  • Action:用于提交 mutation,而不是直接变更状态,可以包含任意异步操作
  • Module:允许将单一的 Store 拆分为多个 store 且同时保存在单一的状态树中。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容