Vue非父子组件通信详解


Posted in Javascript onJune 12, 2017

组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求。组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信。前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有下面的几句

Vue非父子组件通信详解

具体如何去实现却没有很详细的说明,于是自己试着进行了实现。先看下简单的通信效果:

Vue非父子组件通信详解

就是点击了一个组件,另一个组件的数字递加。

html如下:

<div id="app">
  <component-a></component-a>
  <component-b></component-b>
</div>

再来看一下如何实现每一个组件:

var bus = new Vue() //首先建立一个空的Vue实例作为事件的中转

  Vue.component('component-a',{
    template: `<div><button @click="incrementB">{{masgA}}</button></div>`, //添加点击事件incrementB ,因为点击A需要增加B
    data ()  {
      return {
        masgA : 0
      }
    },
    methods: {
      incrementB: function () { //增加B的事件
        bus.$emit('incrementB') //中转站bus 触发incrementB事件
      }
    },
    mounted: function () {
      var _this = this
      bus.$on('incrementA',function(){ //中转站bus自定义increamentA事件用来增加msgA,这个事件最终由组件B进行触发
        _this.masgA ++
      })


 //bus.$on('incrementA',()=>{ //这里也可以用箭头函数,就不会有_this这个变量了,因为箭头函数不会改变this指向



 // this.masgA ++



 //})
    }
  })

从上面的代码可以看出真正的改变方法是通过bus里注册监听事件来实现的,同理代component-b也是一样

Vue.component('component-b',{
    template: `<div><button @click="incrementA">{{masgB}}</button></div>`,
    data ()  {
      return {
        masgB : 0
      }
    },
    methods: {
      incrementA: function () {
        bus.$emit('incrementA')
      }
    },
    mounted: function(){
      bus.$on('incrementB',() => {
        this.masgB ++
      })
    }
  })

完整代码如下,可直接复制运行

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>非父子组件通信</title>
</head>
<body>
  <div id="app">
    <component-a></component-a>
    <component-b></component-b>
  </div>
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
<script>
  var bus = new Vue() //首先建立一个空的Vue实例作为事件的中转

  Vue.component('component-a',{
    template: `<div><button @click="incrementB">{{masgA}}</button></div>`, //添加点击事件
    data ()  {
      return {
        masgA : 0
      }
    },
    methods: {
      incrementB: function () {
        bus.$emit('incrementB')
      }
    },
    mounted: function () {
      var _this = this
      bus.$on('incrementA',function(){
        _this.masgA ++
      })
      bus.$on('incrementA',()=>{
        this.masgA ++
      })
    }
  })

  Vue.component('component-b',{
    template: `<div><button @click="incrementA">{{masgB}}</button></div>`,
    data ()  {
      return {
        masgB : 0
      }
    },
    methods: {
      incrementA: function () {
        bus.$emit('incrementA')
      }
    },
    mounted: function(){
      bus.$on('incrementB',() => {
        this.masgB ++
      })
    }
  })

  var vm = new Vue({
    el: "#app"
  })
</script>

同时也可以看出这么做仅有两个组件就有些麻烦,事件的流向不是很清晰,所以在出现复杂的场景时需要使用VueX进行管理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery isType() 类型判断代码
Feb 14 Javascript
jquery入门—编写一个导航条(可伸缩)
Jan 07 Javascript
jquery动态改变form属性提交表单
Jun 03 Javascript
使用纯javascript实现放大镜效果
Mar 18 Javascript
WEB前端实现裁剪上传图片功能
Oct 17 Javascript
Vue数据驱动模拟实现4
Jan 12 Javascript
AngularJS 防止页面闪烁的方法
Mar 09 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
Sep 06 jQuery
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
Sep 25 Javascript
JavaScript计算出两个数的差值
Mar 19 Javascript
Paypal支付不完全指北
Jun 04 Javascript
详解angularjs 关于ui-router分层使用
Jun 12 #Javascript
Vue 2中ref属性的使用方法及注意事项
Jun 12 #Javascript
深究AngularJS如何获取input的焦点(自定义指令)
Jun 12 #Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 #jQuery
AngularJS自定义指令详解(有分页插件代码)
Jun 12 #Javascript
前端构建工具之gulp的语法教程
Jun 12 #Javascript
前端构建工具之gulp的配置与搭建详解
Jun 12 #Javascript
You might like
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
文本框文本自动补全效果示例分享
2014/01/19 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
Python中为什么要用self探讨
2015/04/14 Python
全面了解python字符串和字典
2016/07/07 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
python中的global关键字的使用方法
2019/08/20 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
python圣诞树编写实例详解
2020/02/13 Python
python在不同条件下的输入与输出
2020/02/13 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
介绍一下linux文件系统分配策略
2013/02/25 面试题
商务主管岗位职责
2013/12/08 职场文书
处级干部考察材料
2014/12/24 职场文书
新员工考核评语
2014/12/31 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
培训讲师开场白
2015/06/01 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书