详解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利用apply和arguments复用方法
Nov 25 Javascript
javascript弹出层输入框(示例代码)
Dec 11 Javascript
javascript编程异常处理实例小结
Nov 30 Javascript
AngularJS通过$sce输出html的方法
Sep 22 Javascript
JS 实现随机验证码功能
Feb 15 Javascript
基于zepto.js实现登录界面
Oct 09 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
Feb 22 Javascript
vue安装和使用scss及sass与scss的区别详解
Oct 15 Javascript
koa源码中promise的解读
Nov 13 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
9个JavaScript评级/投票插件
2010/01/18 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
跟老齐学Python之list和str比较
2014/09/20 Python
用实例解释Python中的继承和多态的概念
2015/04/27 Python
Python实现豆瓣图片下载的方法
2015/05/25 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
python的re模块使用方法详解
2019/07/26 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
Python代码需要缩进吗
2020/07/01 Python
T3官网:头发造型工具
2019/12/26 全球购物
自我评价格式
2014/01/06 职场文书
大型车展策划方案
2014/02/01 职场文书
土地转让协议书
2014/04/15 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
政风行风评议心得体会
2014/10/21 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
2014年平安夜寄语
2014/12/08 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书