详解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 相关文章推荐
setTimeout 不断吐食CPU的问题分析
Apr 01 Javascript
jquery中:input和input的区别分析
Jul 13 Javascript
JS实现随机化快速排序的实例代码
Aug 01 Javascript
javascript简单性能问题及学习笔记
Feb 04 Javascript
Jquery在指定DIV加载HTML示例代码
Feb 17 Javascript
JavaScript中判断整字类型最简洁的实现方法
Nov 08 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
Aug 01 Javascript
解决IE7中使用jQuery动态操作name问题
Aug 28 jQuery
jackson解析json字符串,首字母大写会自动转为小写的方法
Dec 22 Javascript
JS拖拽排序插件Sortable.js用法实例分析
Feb 20 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 Javascript
js canvas实现俄罗斯方块
Oct 11 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
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
不同浏览器的怪癖小结
2010/07/11 Javascript
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
js实现文本上下来回滚动
2017/02/03 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
Python实现从百度API获取天气的方法
2015/03/11 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
Python异常处理操作实例详解
2018/05/10 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
python实现吃苹果小游戏
2020/03/21 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
Python基于Faker假数据构造库
2020/11/30 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
高中运动会入场词
2014/02/14 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
完整版商业计划书
2014/09/15 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
股份转让协议书范本
2015/01/27 职场文书
党员年度个人总结
2015/02/14 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA