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常见开发技巧详细整理
Jan 02 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
jQuery.prop() 使用详解
Jul 19 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
Dec 03 Javascript
Javascript原型链的原理详解
Jan 05 Javascript
D3.js实现雷达图的方法详解
Sep 22 Javascript
js实现将json数组显示前台table中
Jan 10 Javascript
微信小程序 密码输入(源码下载)
Jun 27 Javascript
vue-cli 组件的导入与使用教程详解
Apr 11 Javascript
解决Mac node版本升级失败的问题
May 16 Javascript
VUE2.0中Jsonp的使用方法
May 22 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 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提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
smarty自定义函数用法示例
2016/05/20 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
PHP静态成员变量
2017/02/14 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
js更优雅的兼容
2010/08/12 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
python的类方法和静态方法
2014/12/13 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
Python之os操作方法(详解)
2017/06/15 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
python中scipy.stats产生随机数实例讲解
2021/02/19 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
市场营销专业个人求职信范文
2013/12/14 职场文书
党员学习十八大感想
2014/01/17 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
医学求职信
2014/05/28 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
奖金申请报告模板
2015/05/15 职场文书
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript