详解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 相关文章推荐
Node.js实现简单聊天服务器
Jun 20 Javascript
jQuery中contents()方法用法实例
Jan 08 Javascript
javascript实现网页背景烟花效果的方法
Aug 06 Javascript
深入理解JavaScript中为什么string可以拥有方法
May 24 Javascript
javascript验证内容为数字以及长度为10的简单实例
Aug 20 Javascript
jquery遍历标签中自定义的属性方法
Sep 17 Javascript
H5用户注册表单页 注册模态框!
Sep 17 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
Jun 29 Javascript
vue视频播放暂停代码
Nov 08 Javascript
用Angular实现一个扫雷的游戏示例
May 15 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
Oct 28 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入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
php header函数的常用http头设置
2015/06/25 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
PageFactory设计模式基于python实现
2020/04/14 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
python中如何进行连乘计算
2020/05/28 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
移动通信专业自荐信范文
2013/11/12 职场文书
迟到早退检讨书
2014/02/10 职场文书
《云雀的心愿》教学反思
2014/02/25 职场文书
就业意向书范文
2014/04/01 职场文书
食品安全承诺书
2014/05/22 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
2014年服务员工作总结
2014/11/18 职场文书
汽车销售合同文本
2019/08/08 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
Python预测分词的实现
2021/06/18 Python
利用Apache Common将java对象池化的问题
2022/06/16 Servers