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之appendChild、insertBefore和insertAfter使用说明
Dec 30 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
JQuery 控制内容长度超出规定长度显示省略号
May 23 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
Jan 13 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
Mar 04 Javascript
每天一篇javascript学习小结(属性定义方法)
Nov 19 Javascript
详解JavaScript权威指南之对象
Sep 27 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
Oct 18 Javascript
react 创建单例组件的方法
Apr 26 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
Aug 01 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
Nov 06 Javascript
JavaScript选择器函数querySelector和querySelectorAll
Nov 27 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
模仿OSO的论坛(三)
2006/10/09 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
python实现单向链表详解
2018/02/08 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
你的自行车健身专家:FaFit24
2016/11/16 全球购物
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
保安的辞职报告怎么写
2014/01/20 职场文书
学生会离职感言
2014/02/11 职场文书
校长寄语大全
2014/04/09 职场文书
学生请假条格式
2014/04/11 职场文书
乡镇干部党的群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
小学班主任事迹材料
2014/12/17 职场文书
廉洁自律个人总结
2015/02/14 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
以下牛机,你有几个
2022/04/05 无线电