• props/$emit 父子组件通信

    • 父->子props
    • 子->父 $on$emit 获取父子组件实例 parent、children Ref 获取实例的方式调用组件的属性或者方法
    • 父->子孙 Provide、inject,官方不推荐使用,但是写组件库时很常用
  • $emit/$on 自定义事件 兄弟组件通信
    Event Bus 实现跨组件通信 Vue.prototype.$bus = new Vue() 自定义事件

  • vuex 跨级组件通信
    Vuex、$attrs$listeners Provide、inject


组件间通信的概念

  • 都知道组件是vue最强大的功能之一,vue中每一个.vue我们都可以视之为一个组件
  • 通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的
  • 广义上,任何信息的交通都是通信组件间通信
  • 即指组件(.vue)通过某种方式来传递信息以达到某个目的

组件间通信的分类

  • 父子
  • 兄弟
  • 祖孙与后代
  • 非关系组件

组件间通信的方案

整理vue中8种常规的通信方案

  1. 通过 props 传递
  2. 通过 $emit 触发自定义事件
  3. 使用 ref
  4. EventBus
  5. $parent$root
  6. attrs 与 listeners
  7. Provide 与 Inject
  8. Vuex

props传递数据

  • 适用场景:父组件传递数据给子组件
  • 子组件设置props属性,定义接收父组件传递过来的参数
  • 父组件在使用子组件标签中通过字面量来传递值

$emit 触发自定义事件

  • 适用场景:子组件传递数据给父组件
  • 子组件通过$emit触发自定义事件,$emit第二个参数为传递的数值
  • 父组件绑定监听器获取到子组件传递过来的参数

Chilfen.vue

this.$emit('add', good)

Father.vue

<Children @add="cartAdd($event)" />

ref

  • 父组件在使用子组件的时候设置ref
  • 父组件通过设置子组件ref来获取数据

父组件

<Children ref="foo" />
this.$refs.foo  // 获取子组件实例,通过子组件实例我们就能拿到对应的数据

EventBus

  • 使用场景:兄弟组件传值
  • 创建一个中央时间总线EventBus
  • 兄弟组件通过$emit触发自定义事件,$emit第二个参数为传递的数值
  • 另一个兄弟组件通过$on监听自定义事件

Bus.js

// 创建一个中央时间总线类
class Bus {  constructor() {  this.callbacks = {};   // 存放事件的名字  }  $on(name, fn) {  this.callbacks[name] = this.callbacks[name] || [];  this.callbacks[name].push(fn);  }  $emit(name, args) {  if (this.callbacks[name]) {  this.callbacks[name].forEach((cb) => cb(args));  }  }
}  // main.js
Vue.prototype.$bus = new Bus() // 将$bus挂载到vue实例的原型上
// 另一种方式
Vue.prototype.$bus = new Vue() // Vue已经实现了Bus的功能

Children1.vue

this.$bus.$emit('foo')

Children2.vue

this.$bus.$on('foo', this.handle)

$parent$root

  • 通过共同祖辈$parent或者$root搭建通信侨联

兄弟组件

  • this.$parent.on('add',this.add)

另一个兄弟组件

  • this.$parent.emit('add')

$attrs$listeners

  • 适用场景:祖先传递数据给子孙
  • 设置批量向下传属性$attrs$listeners
  • 包含了父级作用域中不作为 prop 被识别 (且获取) 的特性绑定 ( class 和 style 除外)。
  • 可以通过 v-bind="$attrs" 传⼊内部组件
// child:并未在props中声明foo
<p>{{$attrs.foo}}</p>  // parent
<HelloWorld foo="foo"/>
// 给Grandson隔代传值,communication/index.vue
<Child2 msg="lalala" @some-event="onSomeEvent"></Child2>  // Child2做展开
<Grandson v-bind="$attrs" v-on="$listeners"></Grandson>  // Grandson使⽤
<div @click="$emit('some-event', 'msg from grandson')">
{{msg}}
</div>

provide 与 inject

  • 在祖先组件定义provide属性,返回传递的值
  • 在后代组件通过inject接收组件传递过来的值

祖先组件

provide(){  return {  foo:'foo'  }
}

后代组件

inject:['foo'] // 获取到祖先组件传递过来的值

vuex

  • 适用场景: 复杂关系的组件数据传递
  • Vuex作用相当于一个用来存储共享变量的容器
  • state用来存放共享变量的地方
  • getter可以增加一个getter派生状态,(相当于store中的计算属性),用来获得共享变量的值
  • mutations用来存放修改state的方法。
  • actions也是用来存放修改state的方法,不过action是在mutations的基础上进行。常用来做一些异步操作

小结

  • 父子关系的组件数据传递选择props与$emit进行传递,也可选择ref
  • 兄弟关系的组件数据传递可选择$bus,其次可以选择$parent进行传递
  • 祖先与后代组件数据传递可选择attrs与listeners或者 Provide与 Inject
  • 复杂关系的组件数据传递可以通过vuex存放共享的变量

vue组件的通信方式相关推荐

  1. 【Day13】说一下 Vue 组件的通信方式都有哪些?(父子组件,兄弟组件,多级嵌套组件等等)

    说一下 Vue 组件的通信方式都有哪些?(父子组件,兄弟组件,多级嵌套组件等等) 一.父组件向子组件传值 二.子组件向父组件传值 三.兄弟组件传值 四.跨组件 一.父组件向子组件传值 1.1 prop ...

  2. Vue 组件间通信方式:自定义事件

    前言 前期分享的测试开发系列!Vue 组件间通信方式汇总,总有一款适合你( 5分钟教程-附项目实战案例 )中介绍了 3 种组件间的通信方法,分别是: props 全局事件总线 消息订阅与发布 今天给大 ...

  3. vue组件间通信方式

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用. vue组件间的几种通信方式:props.$emit/$on.vuex.$paraent ...

  4. Vue 组件间通信方式汇总,总有一款适合你( 附项目实战案例 )

    前言 前期分享的 200行纯前端Vue代码!教你写一个专属TodoList[零基础友好] 这个项目案例中使用的组件间通信方式是通过 事件绑定与props 接收来实现的,具体使用方式将在下面进行详细介绍 ...

  5. Vue组件间通信方式(详解)

    1. 组件之间的传值通信 组件之间通讯分为三种: 父传子.子传父.兄弟组件之间的通讯 (1)props/$emit 父传子:父组件通过import引入子组件,并注册,在子组件标签上添加要传递的属性,子 ...

  6. Vue 组件通信方式居然有这么多?你了解几种

    ↓推荐关注↓ 前端技术编程 专注于分享前端技术:JS,HTML5,CSS3,Vue.js,React,Angular 等前端框架和前端开源项目推荐! 0篇原创内容 公众号 vue组件通信的方式,这是在 ...

  7. 超实用的 Vue 组件通信方式大汇总(8种)

    文章目录 前言 一.Vue组件关系 二.Vue组件通信方式 1. props / $emit 1.1 props 父传子 1.2 $emit 子传父 1.3 父子组件双向绑定 1.3.1 v-mode ...

  8. 【Vue】Vue全家桶(三)Vue组件通信+Vue组件插槽+动画与过渡+使用vue-cli解决Ajax跨域问题

    1 Vue组件通信 1.1 组件间通信基本原则 不要在子组件中直接修改父组件的状态数据 数据在哪, 更新数据的行为(函数)就应该定义在哪 1.2 vue 组件间通信方式 props vue 的自定义事 ...

  9. 【Vue.js】vue2组件间通信方式总结

    目录 一.props传参 1.父组件 ==> 子组件 2.子组件 ==> 父组件 二.组件的自定义事件 三.全局事件总线 四.消息订阅和发布 五.vuex 六.插槽 1.默认插槽 2.具名 ...

最新文章

  1. 分割catalina.out 每天生成一个文件
  2. 开发三年,如何摆脱日复一日的CRUD?
  3. 判断一个文件被修改(转)
  4. Python之禅--给编程者的掏心窝子的话
  5. js 判断手机横竖屏的实现方法(不依赖任何其他库)
  6. 电脑知识:磁盘分区相关知识笔记!
  7. oracle form lov 查询慢
  8. 汇编指令速查手册(转)
  9. ubuntu无法安装usb驱动
  10. 20170909在线编程之田忌赛马问题
  11. 1)⑤爬取搜狗旅游部分新闻
  12. win10系统steam登陆计算机授权,Steam怎样取消电脑授权 设置里面有
  13. 2021年海河英才计划天津落户天津最详细过程
  14. 单相/三相桥相/线电压基波幅值总结
  15. 关于试用期的四大认知误区,千万别被渣公司坑了!
  16. Chrome 插件推荐
  17. 使用Trove的integration定制化trove镜像
  18. linux中如何知道了主机IP,获得主机名
  19. iview 中 render函数与renderHeader函数
  20. android 百度地图禁止双击放大缩小,百度地图API 在使用点聚合时,如果放大、缩小或移动地图时,添加的文字标签会消失...

热门文章

  1. TOMCAT内存溢出问题
  2. 全面认识UML-类图元素(java)
  3. 架构设计 | 高并发流量削峰,共享资源加锁机制
  4. 什么情况创建索引?什么情况不创建索引?MySQL如何避免索引失效?
  5. ORA-01919: role 'OLAPI_TRACE_USER' does not exist
  6. minSdkVersion、compileSdkVersion和targetSdkVersion
  7. virtualbox启用远程桌面
  8. Linux各个目录的作用及内容
  9. 怎么hold住版本质量
  10. linux signal 处理