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 checkbox全选/取消全选实现代码
Nov 14 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
Jun 29 Javascript
JavaScript中__proto__与prototype的关系深入理解
Dec 04 Javascript
一道JS前端闭包面试题解析
Dec 25 Javascript
Bootstrap select下拉联动(jQuery cxselect)
Jan 04 Javascript
基于react框架使用的一些细节要点的思考
May 31 Javascript
小程序文字跑马灯效果
Dec 28 Javascript
js实现随机div颜色位置 类似满天星效果
Oct 24 Javascript
jQuery实现可编辑的表格
Dec 11 jQuery
详解JavaScript修改注册表的方法
Jan 05 Javascript
在Vue中使用HOC模式的实现
Aug 23 Javascript
vue+element ui实现锚点定位
Jun 29 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
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
Javascript 学习笔记 错误处理
2009/07/30 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
Python函数嵌套实例
2014/09/23 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
详解python中的线程与线程池
2019/05/10 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
品管员岗位职责
2013/11/10 职场文书
思想品德课教学反思
2014/02/10 职场文书
法律进社区活动总结
2015/05/07 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers