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 相关文章推荐
[原创]网络复制内容时常用的正则+editplus
Nov 30 Javascript
javascript 函数使用说明
Apr 07 Javascript
浅谈Javascript鼠标和滚轮事件
Jun 27 Javascript
js 处理数组重复元素示例代码
Dec 27 Javascript
JavaScript中使用concat()方法拼接字符串的教程
Jun 06 Javascript
easyui validatebox验证
Apr 29 Javascript
JavaScript排序算法动画演示效果的实现方法
Oct 18 Javascript
JS正则匹配中文的方法示例
Jan 06 Javascript
原生js开发的日历插件
Feb 04 Javascript
Angularjs 动态添加指令并绑定事件的方法
Apr 13 Javascript
Vue不能观察到数组length的变化
Jun 08 Javascript
使用vue cli4.x搭建vue项目的过程详解
May 08 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
Yii2语言国际化自动配置详解
2018/08/22 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
python使用mailbox打印电子邮件的方法
2015/04/30 Python
Python Requests安装与简单运用
2016/04/07 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
python查看列的唯一值方法
2018/07/17 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
python爬虫容易学吗
2020/06/02 Python
Python实现随机爬山算法
2021/01/29 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
几道Java和数据库的面试题
2013/05/30 面试题
大学生旅游业创业计划书
2014/01/29 职场文书
元旦联欢会感言
2014/03/04 职场文书
新学期决心书
2014/03/11 职场文书
运动会入场口号
2014/06/07 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
2015年行政部工作总结
2015/04/28 职场文书
聘任合同书
2015/09/21 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
幼儿园2016年圣诞活动总结
2016/03/31 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL