vue中的$emit 与$on父子组件与兄弟组件的之间通信方式


Posted in Javascript onMay 13, 2018

本文主要对vue 用$emit 与 $on 来进行组件之间的数据传输.

主要的传输方式有三种:

1.父组件到子组件通信

2.子组件到父组件的通信

3.兄弟组件之间的通信

一、父组件传值给子组件

父组件给子组件传子,使用props

//父组件:parent.vue
<template>
  <div>
    <child :vals = "msg"></child>
  </div>
</template>
<script>
import child from "./child";
export default {
  data(){
    return {
      msg:"我是父组件的数据,将传给子组件"
    }
  },
  components:{
    child
  }
}
</script>

//子组件:child.vue
<template>
  <div>
    {{vals}}
  </div>
</template>
<script>
export default {
   props:{ //父组件传值 可以是一个数组,对象
    vals:{
      type:String,//类型为字符窜
     default:"123" //可以设置默认值
    }
  },
}
</script>

2.子组件到父组件的通信

使用 $emit(eventname,option) 触发事件,

参数一:自定义事件名称,写法,小写或者用-连接,如event,event-name 不能写驼峰写法(eventName)

子组件给父组件传值,可以在子组件中使用$emit触发事件的值传出去,父组件通过事件监听,获取数据

但是,这里有一个问题,

1、究竟是由子组件内部主动传数据给父组件,由父组件监听接收(由子组件中操作决定什么时候传值)

2、还是通过父组件决定子组件什么时候传值给父组件,然后再监听接收 (由父组件中操作决定什么时候传值)

两种情况都有

2.1 : $meit事件触发,通过子组件内部的事件触发自定义事件$emit

2.2 : $meit事件触发, 可以通过父组件操作子组件 (ref)的事件来触发 自定义事件$emit

第一种情况:

//父组件:parent.vue
<template>
  <div>
    <child v-on:childevent='wathChildEvent'></child>
    <div>子组件的数据为:{{msg}}</div>
  </div>
</template>
<script>
import child from "./child";
export default {
  data(){
    return{
      msg:""
    }
  },
  components:{
    child
  },
  methods:{
    wathChildEvent:function(vals){//直接监听 又子组件触发的事件,参数为子组件的传来的数据
      console.log(vals);//结果:这是子组件的数据,将有子组件操作触发传给父组件
      this.msg = vlas;
    } 
  }
}
</script>
//子组件:child.vue
<template>
  <div>
    <input type="button" value="子组件触发" @click="target">
  </div>
</template>
<script>
export default {
  data(){
      return {
      texts:'这是子组件的数据,将有子组件操作触发传给父组件'
      }
  },
  methods:{
    target:function(){ //有子组件的事件触发 自定义事件childevent
      this.$emit('childevent',this.texts);//触发一个在子组件中声明的事件 childEvnet
    }
  },
}
</script>

第二种情况:

//父组件:parent.vue
<template>
  <div>
    <child v-on:childevent='wathChildEvent' ref="childcomp"></child>
    <input type="button" @click="parentEnvet" value="父组件触发" />
    <div>子组件的数据为:{{msg}}</div>
  </div>
</template>
<script>
import child from "./child";
export default {
  data(){
    return{
      msg:""
    }
  },
  components:{
    child
  },
  methods:{
    wathChildEvent:function(vals){//直接监听 又子组件触发的事件,参数为子组件的传来的数据
      console.log(vals);//这是子组件的数据,将有子组件操作触发传给父组件
      this.msg = vlas;
    },
    parentEnvet:function(){
      this.$refs['childcomp'].target(); //通过refs属性获取子组件实例,又父组件操作子组件的方法触发事件$meit
    }
  }
}
</script>
//子组件:child.vue
<template>
  <div>
   <!-- dothing..... -->
  </div>
</template>
<script>
export default {
  data(){
      return {
      texts:'这是子组件的数据,将有子组件操作触发传给父组件'
      }
  },
  methods:{
    target:function(){ //又子组件的事件触发 自定义事件childevent
      this.$emit('childevent',this.texts);//触发一个在子组件中声明的事件 childEvnet
    }
  },
}
</script>

将两者情况对比,区别就在于$emit 自定义事件的触发是有父组件还是子组件去触发

第一种,是在子组件中定义一个click点击事件来触发自定义事件$emit,然后在父组件监听

第二种,是在父组件中第一一个click点击事件,在组件中通过refs获取实例方法来直接触发事件,然后在父组件中监听

3.兄弟组件之间的通信

 (1)、兄弟之间传递数据通过事件

 (2)、创建一个新Vue的实例,让各个兄弟共用同一个事件机制。(关键点)

 (3)、传递数据方,通过事件触发$emit(方法名,传递的数据)。

 (4)、接收数据方,在mounted()钩子函数(挂载实例)中 触发事件$on(方法名,callback(接收数据的数据)),此时callback函数中的this已经发生了改变,可以使用箭头函数。

//建立一个空的Vue实例,将通信事件挂载在该实例上
//emptyVue.js
import Vue from 'vue'
export default new Vue()
//兄弟组件a:childa.vue
<template>
  <div>
    <span>A组件->{{msg}}</span>
    <input type="button" value="把a组件数据传给b" @click ="send">
  </div>
</template>
<script>
import vmson from "./emptyVue"
export default {
  data(){
    return {
      msg:"我是a组件的数据"
    }
  },
  methods:{
    send:function(){
      vmson.$emit("aevent",this.msg)
    }
  }
}
</script>
//兄弟组件b:childb.vue
<template>
   <div>
    <span>b组件,a传的的数据为->{{msg}}</span>
  </div>
</template>
<script>
import vmson from "./emptyVue"
export default {
 data(){
    return {
      msg:""
    }
  },
  mounted(){
    vmson.$on("aevent",(val)=>{//监听事件aevent,回调函数要使用箭头函数;
      console.log(val);//打印结果:我是a组件的数据
      this.msg = val;
    })
  }
}
</script>
//父组件:parent.vue
<template>
  <div>
    <childa><childa>
    <childb></childb>
  </div>
</template>
<script>
import childa from "./childa";
import childb from "./childb";
export default {
  data(){
    return{
      msg:""
    }
  },
  components:{
    childa,
    childb
  },
}
</script>

到此,vue中的组件通信传值基本可以搞定了,但是对于大型复杂的项目,建议采用vuex 状态管理更适合....

推荐参考学习:https://vuex.vuejs.org/zh-cn/

    https://cn.vuejs.org/v2/api/#vm-emit

   https://cn.vuejs.org/v2/api/#vm-on

总结

以上所述是小编给大家介绍的vue中的$emit 与$on父子组件与兄弟组件的之间通信方式,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
jQuery.buildFragment使用方法及思路分析
Jan 07 Javascript
jQuery 设置 CSS 属性示例介绍
Jan 16 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
Jun 16 Javascript
javascript中callee与caller的区别分析
Apr 20 Javascript
jQuery检测滚动条是否到达底部
Dec 15 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
微信小程序 http请求的session管理
Jun 07 Javascript
vue实现图书管理demo详解
Oct 17 Javascript
JavaScript JMap类定义与使用方法示例
Jan 22 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
Nov 26 Javascript
Vue中qs插件的使用详解
Feb 07 Javascript
JavaScript canvas仿代码流瀑布
Feb 10 Javascript
node 命令方式启动修改端口的方法
May 12 #Javascript
安装Node.js并启动本地服务的操作教程
May 12 #Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
May 12 #Javascript
Vue拖拽组件开发实例详解
May 11 #Javascript
node前端模板引擎Jade之标签的基本写法
May 11 #Javascript
JS实现的简单下拉框联动功能示例
May 11 #Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
May 11 #Javascript
You might like
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Python列表对象实现原理详解
2019/07/01 Python
python中open函数的基本用法示例
2019/09/07 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
简单了解Python write writelines区别
2020/02/27 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
如何转换一个字符串到enum值
2014/04/12 面试题
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
文明班级申报材料
2014/12/24 职场文书
公司开会通知
2015/04/20 职场文书
2016年端午节寄语
2015/12/04 职场文书
学校运动会开幕词
2016/03/03 职场文书
公司周年庆寄语
2019/06/21 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python