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 相关文章推荐
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
May 21 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
Oct 11 Javascript
JavaScript简单实现网页回到顶部功能
Nov 12 Javascript
kindeditor修复会替换script内容的问题
Apr 03 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
Sep 06 Javascript
微信小程序 实现tabs选项卡效果实例代码
Oct 31 Javascript
微信小程序 传值取值的几种方法总结
Jan 16 Javascript
ES6下React组件的写法示例代码
May 04 Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 jQuery
JavaScript捕捉事件和阻止冒泡事件实例分析
Aug 03 Javascript
JavaScript实现星级评价效果
May 17 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
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
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
vue跳转方式(打开新页面)及传参操作示例
2020/01/26 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
Python字符转换
2008/09/06 Python
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
在pycharm中显示python画的图方法
2019/08/31 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
社会学专业求职信
2014/02/24 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
个人租房协议书样本
2014/10/01 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
新教师教学工作总结
2015/08/12 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS