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 相关文章推荐
node.js chat程序如何实现Ajax long-polling长链接刷新模式
Mar 13 Javascript
从jquery的过滤器.filter()方法想到的
Sep 29 Javascript
js获取当前页面的url网址信息
Jun 12 Javascript
原生javascript实现的分页插件pagenav
Aug 28 Javascript
JS绘制生成花瓣效果的方法
Aug 05 Javascript
AngularJS自定义服务与fliter的混合使用
Nov 24 Javascript
JavaScript中object和Object的区别(详解)
Feb 27 Javascript
Javascript实现数组中的元素上下移动
Apr 28 Javascript
浅谈AngularJS中使用$resource(已更新)
Sep 14 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 Javascript
vue项目引入Iconfont图标库的教程图解
Oct 24 Javascript
layui实现左侧菜单点击右侧内容区显示
Jul 26 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
PHP链表操作简单示例
2016/10/15 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
document.documentElement &amp;&amp; document.documentElement.scrollTop
2007/12/01 Javascript
JS解密入门 最终变量劫持
2008/06/25 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
python实现linux下使用xcopy的方法
2015/06/28 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
Python GUI编程完整示例
2019/04/04 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
PHP统计代码行数的小代码
2019/09/19 Python
opencv python如何实现图像二值化
2020/02/03 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
美国第一香水网站:Perfume.com
2017/01/23 全球购物
租赁协议书
2015/01/27 职场文书
党风廉正建设责任书
2015/01/29 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
现货白银电话营销话术
2015/05/29 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android