详解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 相关文章推荐
Aptana调试javascript图解教程
Nov 30 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
jquery实现手机号码选号的方法
Jul 31 Javascript
jQuery.uploadify文件上传组件实例讲解
Sep 23 Javascript
jQuery简单自定义图片轮播插件及用法示例
Nov 21 Javascript
浅谈Angular的$q, defer, promise
Dec 20 Javascript
React快速入门教程
Jan 17 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
Jan 18 Javascript
原生js实现鼠标跟随效果
Feb 28 Javascript
jQuery实现扑克正反面翻牌效果
Mar 10 Javascript
axios取消请求的实践记录分享
Sep 26 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
Feb 03 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 strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
Python实现队列的方法
2015/05/26 Python
Python中的 enum 模块源码详析
2019/01/09 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
配件采购员岗位职责
2013/12/03 职场文书
工作作风承诺书
2014/08/30 职场文书
社区元宵节活动总结
2015/02/06 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
MySQL数据库 任意ip连接方法
2022/05/20 MySQL