详解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 相关文章推荐
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
Jun 02 Javascript
一个javascript图片阅览组件
Nov 09 Javascript
js获得网页背景色和字体色的方法
Mar 21 Javascript
简单实现jQuery级联菜单
Jan 09 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
Jul 03 Javascript
vue webpack打包后图片路径错误的完美解决方法
Dec 07 Javascript
详解javascript对数组和json数组的操作
Apr 15 Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
Jun 10 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 Javascript
JavaScript中this函数使用实例解析
Feb 21 Javascript
vue-cli3自动消除console.log()的调试信息方式
Oct 21 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
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
js+audio实现音乐播放器
2020/09/13 Javascript
python实现爬虫下载漫画示例
2014/02/16 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
python 模块导入问题汇总
2021/02/01 Python
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
销售文员岗位职责
2013/11/29 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
民主生活会汇报材料
2014/12/15 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS
MySQL深分页问题解决思路
2022/12/24 MySQL