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 且同时保存在单一的状态树中。

Vue 组件间通信有哪几种方式相关推荐

  1. 每日一道面试题:Vue 组件间通信有哪几种方式?

    Vue 组件间通信有哪几种方式? 父子组件通信.隔代组件通信.兄弟组件通信 (1)props / $emit适用 父子组件通信 - 这种方法是 Vue 组件的基础,相信大部分同学耳闻能详,所以此处就不 ...

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

    (1)**props / $emit** 适用 父子组件通信 这种方法是 Vue 组件的基础,相信大部分同学耳闻能详,所以此处就不举例展开介绍. (2)**ref** 与 **$parent / $c ...

  3. vue组件间通信传递数据的四种方式(路由传参、父子组件传参、兄弟组件传参、深层次传参)

    前言: vue组件间通信对于经常来写vue的伙伴来说应该是很轻松的,对于一些刚入门的伙伴来说可能就有些迷茫,感觉方式有很多种,但是总结起来又不知道应该怎么说,在下面的文章中,我结合自己的开发过程中经常 ...

  4. Vue 组件间通信几种方式(完整版)

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 如上图所示,A 和 B.B 和 C.B 和 D 都是 ...

  5. vue组件间通信六种方式

    vue组件间通信六种方式 组件之间的传值通信 组件之间的通讯分为三种:父传子.子传父.兄弟之间的通讯: props/$emit 父传子:主要是通过props来实现的 具体实现:父组件通过import引 ...

  6. vue组件间通信六种方式(完整版)

    前言   组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系:                如上图所示 ...

  7. Vue 组件间通信方法汇总

    Vue 组件间通信方法汇总 ⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅 除了使用 Vuex 方法外,vue 提供了各种各样的组件间通信的方案.文章整理一下父子组件.兄弟组件.祖先后代组件间 ...

  8. Vue.js解析(十)【Vue组件间通信】

    什么是Vue组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊 ...

  9. vue组件间通信之兄弟组件通信(vue3.0$EventBus)

    vue组件间通信之兄弟组件通信(vue3.0$EventBus) vue组件中的数据传递最最常见的就是父子组件之间的传递.父传子通过props向下传递数据给子组件:子传父通过$emit发送事件,并携带 ...

最新文章

  1. python连接文本文件_Python连接文本文件
  2. 用SAPI实现Speech Recognition(SR) - 听写模式
  3. java 方法大全_java中的方法大全
  4. mysql分组后去重复数据_mysql去掉重复数据只保留一条,以及取分组后的一条数据...
  5. Hangfire定时触发作业,好像很简单?
  6. java伪装反序列化字节流_java对象序列化流和反序列化流
  7. 创业冲突的五种解决方法是_失眠原因不同,中医五种调理方法解决问题!
  8. leetcode328 奇偶链表
  9. Java基础入门笔记-重写
  10. iOS中利用UISearchBar实现搜索
  11. WCF中如何修改MaxItemsInObjectGraph的限制
  12. 服务器硬件防火墙与软件防火墙的作用和区别
  13. JavaScript学习第十九天
  14. Fall 2011 CS193P Assignment 2: 可编程计算器答案
  15. Workbook corruption: seen[2] == 4
  16. 启动项目InterviewerPortal
  17. 设置Ubuntu 20.04的静态IP地址
  18. Python基础 day3
  19. 阿里巴巴第三方接口发送短信验证码
  20. 九齐新型单片机NY8A051F

热门文章

  1. 手把手教你开发一款1024程序员节日历提醒服务
  2. 多个tensor合并成一个——四个三维tensor合成一个四维tensor——四个[3,512,1024]变成[4,3,512,1024]
  3. 碾转相除法求最大公约数
  4. 在32位WINDOWS系统上开发64位应用程序
  5. 《阴阳师》桃花妖在哪打
  6. 4-CNN-demo-0502-BNorm_work
  7. python发微信提醒天气冷了注意保暖_秋天了,降温天气变冷注意保暖的微信早安问候语...
  8. mysql的事务实现
  9. android ratingbar 高度,android (RatingBar)
  10. CAUNTLY:为什么人们更喜欢大屏手机