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 相关文章推荐
在Javascript中定义对象类别
Dec 22 Javascript
jquery获取input表单值的代码
Apr 19 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
Nov 30 Javascript
Js注册协议倒计时的小例子
Jun 24 Javascript
jquery和ajax的关系详细介绍
Nov 29 Javascript
取消选中单选框radio的三种方式示例介绍
Dec 23 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
May 06 Javascript
JavaScript实现数组随机排序的方法
Jun 26 Javascript
数组Array的排序sort方法
Feb 17 Javascript
一个有意思的鼠标点击文字特效jquery代码
Sep 23 jQuery
vue小白入门教程
Apr 02 Javascript
详解html-webpack-plugin插件(用法总结)
Sep 12 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的memory_limit限制的方法分享
2012/02/21 PHP
php实现的mongodb操作类
2015/05/28 PHP
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
2013/04/28 Javascript
js 通用订单代码
2013/12/23 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
深入理解python函数递归和生成器
2016/06/06 Python
Python实现视频下载功能
2017/03/14 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
python默认参数调用方法解析
2020/02/09 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
指针和引用有什么区别
2013/01/13 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
入职担保书怎么写
2014/05/12 职场文书
个人查摆剖析材料
2014/10/04 职场文书
上下班时间调整通知
2015/04/23 职场文书
行政答辩状范文
2015/05/21 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
合同范本之电脑出租
2019/08/13 职场文书
python批量创建变量并赋值操作
2021/06/03 Python
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js