Vue组件通信的四种方式汇总


Posted in Javascript onFebruary 08, 2018

前言

众所周知vue是一种mvvm框架,它相对于jquery可能比较大的差异点之一就在于组件之间的通信了。本文重点是梳理了前两个,父子组件通信和eventBus通信,我觉得Vue文档里的说明还是有一些简易,我自己第一遍是没看明白。

  • 父子组件的通信
  • 非父子组件的eventBus通信
  • 利用本地缓存实现组件通信
  • Vuex通信

第一种通信方式:父子组件通信

父组件向子组件传递数据

父组件一共需要做4件事

      1.import son from './son.js' 引入子组件 son

      2.在components : {"son"} 里注册所有子组件名称

      3.在父组件的template应用子组件, <son></son>

      4.如果需要传递数据给子组件,就在template模板里写 <son :num="number"></son>

// 1.引入子组件 
 import counter from './counter'
 import son from './son'
// 2.在ccmponents里注册子组件
 components : {
 counter,
 son
 },
// 3.在template里使用子组件
 <son></son>
// 4.如果需要传递数据,也是在templete里写
 <counter :num="number"></counter>

子组件只需要做1件事

      1.用props接受数据,就可以直接使用数据

      2.子组件接受到的数据,不能去修改。如果你的确需要修改,可以用计算属性,或者把数据赋值给子组件data里的一个变量

// 1.用Props接受数据
 props: [
  'num'
  ],
// 2.如果需要修改得到的数据,可以这样写
 props: [
  'num'
 ],
 data () {
 return {
  number : this.num
 }
 },

子组件向父组件传递数据

父组件一共需要做2件事情

在template里定义事件

在methods里写函数,监听子组件的事件触发

// 1. 在templete里应用子组件时,定义事件changeNumber
 <counter :num="number"
   @changeNumber="changeNumber"
 >
 </counter>
// 2. 用changeNumber监听事件是否触发
 methods: {
  changeNumber(e){
  console.log('子组件emit了',e);
  this.number = e
  },
 }

子组件一共需要1件事情

在数据变化后,用$emit触发即可

// 1. 子组件在数据变化后,用$emit触发即可,第二个参数可以传递参数
 methods: {
  increment(){
   this.number++
   this.$emit('changeNumber', this.number)
  },
 }

第二种通信方式: eventBus

eventBus这种通信方式,针对的是非父子组件之间的通信,它的原理还是通过事件的触发和监听。

但是因为是非父子组件的关系,他们需要有一个中间组件来连接。

我是使用的通过在根组件,也就是#app组件上定义了一个所有组件都可以访问到的组件,具体使用方式如下

使用eventBus传递数据,我们一共需要做3件事情

      1.给app组件添加Bus属性 (这样所有组件都可以通过this.$root.Bus访问到它,而且不需要引入任何文件)

      2.在组件1里,this.$root.Bus.$emit触发事件

      3.在组件2里,this.$root.Bus.$on监听事件

// 1.在main.js里给app组件,添加bus属性
import Vue from 'vue'
new Vue({
 el: '#app',
 components: { App },
 template: '<App/>',
 data(){
 return {
 Bus : new Vue()
 }
 }
})
// 2.在组件1里,触发emit
increment(){
 this.number++
 this.$root.Bus.$emit('eventName', this.number)
 },
// 3.在组件2里,监听事件,接受数据
mounted(){
 this.$root.Bus.$on('eventName', value => {
 this.number = value
 console.log('busEvent');
 })
},

第三种通信方式: 利用localStorage或者sessionStorage

这种通信比较简单,缺点是数据和状态比较混乱,不太容易维护。

通过window.localStorage.getItem(key) 获取数据

通过window.localStorage.setItem(key,value) 存储数据

注意:JSON.parse() / JSON.stringify() 做数据格式转换。

第四种通信方式: 利用Vuex

Vuex比较复杂,可以单独写一篇

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
让网页根据不同IE版本显示不同的内容
Feb 08 Javascript
jquery中的on方法使用介绍
Dec 29 Javascript
脚本合并提升javascript性能示例
Feb 24 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
Dec 12 Javascript
JavaScript验证Email(3种方法)
Sep 21 Javascript
深入探讨Vue.js组件和组件通信
Sep 12 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
Dec 20 Javascript
详解基于Node.js的HTTP/2 Server实践
May 31 Javascript
mpvue开发音频类小程序踩坑和建议详解
Mar 12 Javascript
使用vue实现各类弹出框组件
Jul 03 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
Nov 04 Javascript
Vue Socket.io源码解读
Feb 07 #Javascript
原生JavaScript实现的简单放大镜效果示例
Feb 07 #Javascript
Express下采用bcryptjs进行密码加密的方法
Feb 07 #Javascript
Vue Element使用icon图标教程详解(第三方)
Feb 07 #Javascript
Vue.set()实现数据动态响应的方法
Feb 07 #Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
Feb 07 #Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
Feb 07 #Javascript
You might like
什么是MVC,好东西啊
2007/05/03 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
统计出现最多的字符次数的js代码
2010/12/03 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
Delphi CS笔试题
2014/01/04 面试题
即兴演讲稿
2014/01/04 职场文书
儿媳婚宴答谢词
2014/01/14 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
迎新晚会策划方案
2014/06/13 职场文书
假释思想汇报范文
2014/10/11 职场文书
孔庙导游词
2015/02/04 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python
MySQL创建管理LIST分区
2022/04/13 MySQL
Linux安装Docker详细教程
2022/07/07 Servers