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 相关文章推荐
一个tab标签切换效果代码
Mar 27 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
Nov 14 Javascript
ExtJs纵坐标值重复问题的解决方法
Feb 27 Javascript
jquery的总体架构分析及实现示例详解
Nov 08 Javascript
javascript的函数作用域
Nov 12 Javascript
jquery禁止回车触发表单提交
Dec 12 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
Aug 10 Javascript
JavaScript解析JSON格式数据的方法示例
Jan 24 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
详解js实时获取并显示当前时间的方法
May 10 Javascript
laydate只显示时分 不显示秒的功能实现方法
Sep 28 Javascript
如何优雅地在Node应用中进行错误异常处理
Nov 25 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
PHP使用适合阅读的格式显示文件大小的方法
2015/03/05 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
Document 对象的常用方法
2009/07/31 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
JavaScript变量的作用域全解析
2015/08/14 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
python执行外部程序的常用方法小结
2015/03/21 Python
python中返回矩阵的行列方法
2018/04/04 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
基于python实现从尾到头打印链表
2019/11/02 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
学习Python列表的基础知识汇总
2020/03/10 Python
Django数据统计功能count()的使用
2020/11/30 Python
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
医学生求职自荐信
2013/10/25 职场文书
支教自我鉴定
2014/01/18 职场文书
物业管理毕业生的自我评价
2014/02/17 职场文书
分公司经理任命书
2014/06/05 职场文书
作风建设剖析材料
2014/10/06 职场文书
MySQL创建管理RANGE分区
2022/04/13 MySQL