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编程起步(第六课)
Feb 27 Javascript
写了一个layout,拖动条连贯,内容区可为iframe
Aug 19 Javascript
setTimeout()与setInterval()方法区别介绍
Dec 24 Javascript
jquery验证邮箱格式是否正确实例讲解
Nov 16 Javascript
基于jquery插件编写countdown计时器
Jun 12 Javascript
利用JS判断客户端类型你应该知道的四种方法
Dec 22 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
Mar 22 Javascript
vue多页面开发和打包正确处理方法
Apr 20 Javascript
使用layui定义一个模块并使用的例子
Sep 14 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
Jul 15 Javascript
微信小程序接入vant Weapp组件的详细步骤
Oct 28 Javascript
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
详解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生成txt文件实例代码介绍
2016/04/28 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
js实现登录与注册界面
2017/11/01 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
Python requests库用法实例详解
2018/08/14 Python
python3.7 的新特性详解
2019/07/25 Python
python下载库的步骤方法
2019/10/12 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
英国在线购买轮胎、预订汽车、汽车维修和装配网站:Protyre
2020/04/12 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
Python中如何定义一个函数
2016/09/06 面试题
财务分析个人的自荐书范文
2013/11/24 职场文书
2015年小学开学寄语
2015/02/27 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
学生安全责任协议书
2016/03/22 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
2016年社区文体活动总结
2016/04/06 职场文书