详解vue组件通信的三种方式


Posted in Javascript onJune 30, 2017

1. 第一种方式就是官方推荐的

官方推荐方式

有时候两个组件也需要通信(非父子关系)。在简单的场景下,可以使用一个空的 Vue 实例作为中央事件总线。

本质是通过派发事件然后监听事件从而更改值,(父子组件通信也可用这个方式,但是不同的一点就是父子组件通信的时候可以不用一个空的Vue实例来做中转,这种方式我这里就不做演示的了,因为我的题目是非父子通信)

空的Vue实例 bus

import Vue from 'vue'

const bus = new Vue()
export default bus

组件add

<!--html结构-->
<template>
 <div>
  <p>我是add组件的num:{{num}} </p>
  <button @click='add'>增加</button>
 </div>
</template>
// js
<script>
import bus from '../bus.js'
export default {
 data() {
  return {
   num: ''
  }
 },
 methods: {
  add() {
   if (this.num) {
    this.num++
    bus.$emit('num-change', this.num)
   } else {
    this.num = 1
    bus.$emit('num-change', this.num)
   }
  }
 }
}
</script>

组件sub

<!--html结构-->
<template>
 <div>
  <p>我是sub组件的num:{{num}}</p>
 </div>
</template>
// js
<script>
import bus from '../bus.js'
export default {
 data() {
  return {
   num: ''
  }
 },
 created() {
  bus.$on('num-change', num => {
   this.num = num
  })
 }
}
</script>

2.通过vuex来进行状态管理

官方状态管理

vuex我这里就不详细说了,网上教程太多。

3.取巧利用js中的对象的特性(指针)

Object在内存中存储只是保留指针,所以父组件通过props来给兄弟组件传递同一个对象,兄弟组件接收的对象跟父组件的对象都是指向同一个内存地址,故不管在哪里修改都能保持一致。

上代码,父组件把同一个对象传递给add组件和sub组件,那么add组件和sub组件接收到的对象也是指向父组件app的对象都是指向同一个内存地址。add组件对传入的对象进行+1的操作,sub组件进行-1的操作。

父组件 app.vue

<!--html结构-->
<template>
 <div id="app">
  <h1>我是app父组件的newNum:{{share.newNum}}</h1>
  <hr>
  <!--将同一个对象同时传给两个子组件-->
  <addnum :share1='share'></addnum>
  <hr>
  <subnum :share2='share'></subnum>
 </div>
</template>
// js
import addnum from './components/add'
import subnum from './components/sub'

export default {
 data() {
  return {
   share: {
    newNum: 1
   }
  }
 },
 components: {
  addnum, subnum
 }
}

子组件add.vue

<!--html结构-->
<template>
 <div>
  <p>我是add组件的newNum:{{share1.newNum}} </p>
  <button @click='add'>增加</button>
 </div>
</template>
//js
<script>
export default {
 methods: {
  add() {
   this.share1.newNum++
  }
 },
 props: {
  share1: {
   type: Object,
  }
 }
}
</script>

子组件sub.vue

<!--html结构-->
<template>
 <div>
  <p>我是sub组件的newNum:{{share2.newNum}}</p>  
  <button @click='numSub'>减少</button>
 </div>
</template>
// js
<script>
export default {
 methods: {
  numSub() {
   this.share2.newNum--
  }
 },
 props: {
  share2: {
   type: Object,
  }
 }
}
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
将HTML自动转为JS代码
Jun 26 Javascript
原创javascript小游戏实现代码
Aug 19 Javascript
Jquery实现页面加载时弹出对话框代码
Apr 19 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
Jun 02 Javascript
jquery foreach使用示例
Sep 12 Javascript
Jquery 点击按钮自动高亮实现原理及代码
Apr 25 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
Nov 02 Javascript
Bootstrap模态框案例解析
Mar 05 Javascript
node解析修改nginx配置文件操作实例分析
Nov 06 Javascript
Angular8 实现table表格表头固定效果
Jan 03 Javascript
在VUE style中使用data中的变量的方法
Jun 19 Javascript
vue使用screenfull插件实现全屏功能
Sep 17 Javascript
JavaScript实现瀑布流图片效果
Jun 30 #Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
Jun 30 #Javascript
vue.js移动端tab组件的封装实践实例
Jun 30 #Javascript
jQuery表单设置值的方法
Jun 30 #jQuery
JavaScript注册时密码强度校验代码
Jun 30 #Javascript
Bootstrap Table从零开始
Jun 30 #Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 #Javascript
You might like
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
2014/11/22 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
javascript匀速运动实现方法分析
2016/01/08 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
[53:15]Mineski vs iG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python集合用法实例分析
2015/05/30 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
python如何读取bin文件并下发串口
2019/07/05 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
财务部出纳岗位职责
2013/12/22 职场文书
户外用品商店创业计划书
2014/01/29 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
在职证明书模板
2015/06/15 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers