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 相关文章推荐
JavaScript Date对象使用总结
May 14 Javascript
juqery 学习之三 选择器 简单 内容
Nov 25 Javascript
jquery实现图片灯箱明暗的遮罩效果
Nov 15 Javascript
jQuery中多个元素的Hover事件解决方案
Jun 12 Javascript
使用jQuery设置disabled属性与移除disabled属性
Aug 21 Javascript
javascript实现tab切换的两个实例
Nov 05 Javascript
jquery悬浮提示框完整实例
Jan 13 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
Aug 28 Javascript
JavaScript实现预览本地上传图片功能完整示例
Mar 08 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
Jun 20 Javascript
JavaScript小技巧带你提升你的代码技能
Sep 15 Javascript
5种 JavaScript 方式实现数组扁平化
Oct 05 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
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
Yii快速入门经典教程
2015/12/28 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
js自带函数备忘 数组
2006/12/29 Javascript
Js动态创建div
2008/09/25 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
python写的ARP攻击代码实例
2014/06/04 Python
django如何实现视图重定向
2019/07/24 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
美国知名艺术画网站:Art.com
2017/02/09 全球购物
简历自我评价怎么写好呢?
2014/01/04 职场文书
大学社团计划书
2014/05/01 职场文书
具结保证书
2015/01/17 职场文书
财务统计员岗位职责
2015/04/14 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
《叶问2》观后感
2015/06/15 职场文书
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
python面向对象版学生信息管理系统
2021/06/24 Python
ubuntu下常用apt命令介绍
2022/06/05 Servers