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 相关文章推荐
js 模拟实现类似c#下的hashtable的简单功能代码
Jan 24 Javascript
基于jQuery.Validate验证库知识点的详解
Apr 26 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
May 22 Javascript
基于JavaScript实现在新的tab页打开url
Aug 04 Javascript
TypeScript学习之强制类型的转换
Dec 27 Javascript
详解AngularJS controller调用factory
May 19 Javascript
详解Webpack DLL用法以及功能
Jul 11 Javascript
分分钟学会vue中vuex的应用(入门教程)
Sep 14 Javascript
vue el-table实现行内编辑功能
Dec 11 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
Jul 01 Javascript
JS的时间格式化和时间戳转换函数示例详解
Jul 27 Javascript
design vue 表格开启列排序的操作
Oct 28 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
header导出Excel应用示例
2014/01/24 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
angularjs基础教程
2014/12/25 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
Python实现自动访问网页的例子
2020/02/21 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
市场营销专科应届生求职信
2013/11/24 职场文书
大学校务公开实施方案
2014/03/31 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
转正申请报告格式
2015/05/15 职场文书
大学学生会竞选稿
2015/11/19 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers