详解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日期格式化示例分享
Mar 05 Javascript
js原生Ajax的封装和原理详解
Mar 11 Javascript
ES6中参数的默认值语法介绍
May 03 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 Javascript
详解node服务器中打开html文件的两种方法
Sep 18 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
Dec 15 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
vscode下的vue文件格式化问题
Nov 28 Javascript
Mint UI实现A-Z字母排序的城市选择列表
Dec 28 Javascript
webpack file-loader和url-loader的区别
Jan 15 Javascript
深入了解JavaScript 防抖和节流
Sep 12 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
Jan 27 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获取二维数组中某一列的值集合
2015/12/25 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
Python3 翻转二叉树的实现
2019/09/30 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
应届生财务管理求职信
2013/11/06 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
鲁冰花观后感
2015/06/10 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书