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程序 入门者学习
Jul 09 Javascript
javascript面向对象之二 命名空间
Feb 08 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
jQuery制作仿Mac Lion OS滚动条效果
Feb 10 Javascript
莱鸟介绍javascript onclick事件
Jan 06 Javascript
jquery遍历标签中自定义的属性方法
Sep 17 Javascript
快速掌握jQuery插件开发
Jan 19 Javascript
es6 symbol的实现方法示例
Apr 02 Javascript
全面了解JavaScript的作用域链
Apr 03 Javascript
JavaScript如何实现元素全排列实例代码
May 14 Javascript
vue集成kindeditor富文本的实现示例代码
Jun 07 Javascript
vue实现图片预览组件封装与使用
Jul 13 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正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
简单的js分页脚本
2009/05/21 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
js链表操作(实例讲解)
2017/08/29 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
python实现矩阵打印
2019/03/02 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
python安装pil库方法及代码
2019/06/25 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
Python Django路径配置实现过程解析
2020/11/05 Python
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
信访工作者先进事迹
2014/01/17 职场文书
开业典礼主持词
2014/03/21 职场文书
倡议书范文格式
2014/05/12 职场文书
公安学专业求职信
2014/07/27 职场文书
个人整改方案范文
2014/10/25 职场文书
英文辞职信范文
2015/05/13 职场文书
python计算列表元素与乘积详情
2022/08/05 Python