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必备 api中英文对照的chm手册 下载
May 03 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
jquery实现div拖拽宽度示例代码
Jul 31 Javascript
jquery和ajax的关系详细介绍
Nov 29 Javascript
AngularJS入门教程之多视图切换用法示例
Nov 02 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
Feb 19 Javascript
使用Vue自定义指令实现Select组件
May 24 Javascript
js实现各浏览器全屏代码实例
Jul 03 Javascript
Vue如何实现响应式系统
Jul 11 Javascript
详解使用VueJS开发项目中的兼容问题
Aug 02 Javascript
vue项目前端知识点整理【收藏】
May 13 Javascript
JavaScript如何操作css
Oct 24 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
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
解javascript 混淆加密收藏
2009/01/16 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
文本框水印提示效果的简单实现代码
2014/02/22 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
python删除列表中重复记录的方法
2015/04/28 Python
python flask实现分页效果
2017/06/27 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
Python创建数字列表的示例
2019/11/28 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
机电一体化求职信
2014/03/10 职场文书
现金出纳岗位职责
2014/03/15 职场文书
新春文艺演出主持词
2014/03/27 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
团员自我评价范文
2015/03/10 职场文书
会议主持词通用版
2019/04/02 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB