详解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 相关文章推荐
JXTree对象,读取外部xml文件数据,生成树的函数
Apr 02 Javascript
CSS+jQuery实现的一个放大缩小动画效果
Sep 24 Javascript
JavaScript获取当前页面上的指定对象示例代码
Feb 28 Javascript
动态载入js提高网页打开速度的方法
Jul 04 Javascript
node.js中的socket.io的广播消息
Dec 15 Javascript
jQuery Ajax使用实例
Apr 16 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
Aug 26 Javascript
使用 bootstrap modal遇到的问题小结
Nov 09 Javascript
Servlet实现文件上传,可多文件上传示例
Dec 05 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
Sep 13 Javascript
JS实现按比例缩小图片宽高
Aug 24 Javascript
vue实现列表垂直无缝滚动
Apr 08 Vue.js
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 中文处理技巧
2010/04/25 PHP
PHP 面向对象详解
2012/09/13 PHP
ThinkPHP使用smarty模板引擎的方法
2014/07/01 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
python xpath获取页面注释的方法
2019/01/14 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python 动态调用函数实例解析
2019/10/21 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
python的sys.path模块路径添加方式
2020/03/09 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
JSP&Servlet技术面试题
2015/05/21 面试题
二年级体育教学反思
2014/01/15 职场文书
网络工程师职业规划
2014/02/10 职场文书
英文感谢信格式
2015/01/21 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
Python内置的数据类型及使用方法
2022/04/13 Python