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 相关文章推荐
escape、encodeURI、encodeURIComponent等方法的区别比较
Dec 27 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
Feb 07 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
JQuery显示隐藏DIV的方法及代码实例
Apr 16 Javascript
JS实现添加,替换,删除节点元素的方法
Jun 30 Javascript
jQuery基于ID调用指定iframe页面内的方法
Jul 06 Javascript
JS实现物体带缓冲的间歇运动效果示例
Dec 22 Javascript
javascript完美实现给定日期返回上月日期的方法
Jun 15 Javascript
React.Js添加与删除onScroll事件的方法详解
Nov 03 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
Dec 31 Javascript
JavaScript高级函数应用之分时函数实例分析
Aug 03 Javascript
通过实例解析JavaScript for in及for of区别
Jun 15 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
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
学习使用PHP数组
2006/10/09 PHP
使用adodb lite解决问题
2006/12/31 PHP
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
Django发送html邮件的方法
2015/05/26 Python
使用python3.5仿微软记事本notepad
2016/06/15 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
茶叶生产计划书
2014/01/10 职场文书
违反学校规定检讨书
2014/01/18 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
房产公证书范本
2014/04/10 职场文书
保证书格式范文
2014/04/28 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
毕业答辩开场白范文
2015/05/27 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python
英镑符号 £
2022/02/17 杂记
Python获取字典中某个key的value
2022/04/13 Python