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 02 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
Javascript中神奇的this
Jan 20 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
Feb 22 Javascript
javascript 判断一个对象为数组的方法
May 03 Javascript
微信公众号H5支付接口调用方法
Jan 10 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
Aug 08 Javascript
react实现同页面三级跳转路由布局
Sep 26 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
Nov 05 Javascript
JavaScript进制转换实现方法解析
Jan 18 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中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
php中的观察者模式简单实例
2015/01/20 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
php代码架构的八点注意事项
2016/01/25 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
动态控制Table的js代码
2007/03/07 Javascript
brook javascript框架介绍
2011/10/10 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
Python中scatter函数参数及用法详解
2017/11/08 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
Python列表元素常见操作简单示例
2019/10/25 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
应届医学毕业生求职信分享
2013/12/02 职场文书
2014年实验室工作总结
2014/12/03 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
Pandas搭配lambda组合使用详解
2022/01/22 Python
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang
js作用域及作用域链工作引擎
2022/07/07 Javascript