$emit和$on的使用及说明

1. vm.$on(event,callback)

用法:监听当前实例上的自定义事件。事件可以由vm.$emit触发。回调函数会接收所有传入事件触发函数的额外函数。

个人理解:监听接收传来的值

vm.$on('test',function(msg){
  console.log(msg)
})

示例:

2. vm.$emit(eventName,[…args])

用法:触发当前实例上的事件。附加参数都会传给监听器回调。

个人理解: 注册一个自定义事件

// 只配合一个事件名使用emit
// 子组件
Vue.component('welcome-button',{
  template: `
    <button @click="$emit('welcome')">点击按钮</button>
  `
})
// 父组件
<div>
  <welcome-button v-on:welcome="sayHi"></welcome-button>
</div>  
...
...
...
methods: {
  sayHi() {
    alert('Hi!')  
  }
}

3.示例

有时候项目里面会遇到子组件与子组件通信。比如以下情况:

页面里引入了header组件和content组件,点击content组件的按钮,想要改变header组件的内容。

<template>
  <div class="home">
    <v-header></v-header>
    <v-content></v-content>
  </div>
</template>
<script>

image.png

(1)首先,在main.js里面全局注册一个eventbus的方法

import Vue from 'vue';
import App from './App.vue';
import router from './router';
Vue.config.productionTip = false;
Vue.prototype.$EventBus = new Vue();
new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

(2)然后在content组件注册一个自定义事件:

<template>
  <div class="content">
    <img alt="Vue logo" src="../assets/logo.png">
    <button @click="changeEvent">I am content!</button>
  </div>
</template>
<script>
export default {
  name: 'Content',
  methods: {
    changeEvent() {
      // 注册一个自定义事件
      this.$EventBus.$emit("changeNum",123)
    }
  }
}
</script>
<style scoped>
button{
  width: 200px;
  height: 50px;
  display: block;
  margin: 0 auto;
  border: none;
  color: #fff;
  font-size: 20px;
  border-radius: 6px;
  background: #007ef3;
}
</style>

(3)在header组件监听接收这个值:

<template>
  <div class="header">
    <h1>{{headStr}}</h1>
  </div>
</template>
<script>
export default {
  name: 'Header',
  data(){
    return{
      headStr:"This is my head!"
    }
  },
  created() {
    // 监听接收这个值
    this.$EventBus.$on("changeNum", (val) => {
      this.headStr = val;
    });
   
  }
}
</script>
<style scoped>
</style>

点击按钮,header变化如下:

image.png

这样就可以完成子组件与子组件之间的传值了,当然也可以用Vuex进行子组件之间传值。

$emit和$on(在同一个组件中的用法 )

百度之后,终于明白$emit 和 $on 的基础用法。不多说 ,直接上课。

  • $on('事件名字'); /监听事件,事件名字是 str型
  • $emit('事件名字',回调函数);//事件名字是 str型,当然,可以有多个事件名字,如果存在多个事件名字,那么就是用数组。

假设有一个按纽,希望在点击按纽之后触发某一个方法。那么我们可以这样。

<button @click='emit'>只触发一个方法</button>
created () {
      this.$on('wash_Goods',(arg)=> {
          console.log(arg)//这儿的arg能接收到 下面的参数
      })
  },
  methods : {
      emit () {
         this.$emit('wash_Goods',['fish',true,{name:'vue',verison:'2.4'}])
      }
  }

我们可以这样子去理解,首先,点击按纽,它就会走emit的方法。 在该方法中。遇到emit,那么它就会找它需要监听到washGoods的事件,找啊找。

然后,它在created的生命周期中找到了。原来,在created生命周期中有一个叫this.on(‘wash_Goods’)的监听事件。同时,该事件会有一个对应的执行方法。那么,它就会顺着走下去,直接执行 刚在 this.$on(‘wash_Goods’)的监听方法。

this.$on('wash_Goods',(arg)=> {
    console.log(1)
    console.log(arg)//这儿的arg能接收到 下面的参数
})
this.$on('wash_Goods',(arg)=> {
    console.log(2)
    console.log(arg)//这儿的arg能接收到 下面的参数
})
this.$on('wash_Goods',(arg)=> {
    console.log(3)
    console.log(arg)//这儿的arg能接收到 下面的参数
})
//那么,这个按纽在点击之后就会触发这三个方法。 

或许,有同学会问了,刚我提到,在监听事件晨在,监听的事件可以是数组。没错,是数组,即

<button @click='emit'>只触发一个方法</button>
created () {
    this.$on('wash_Goods',(arg)=> {
        console.log('执行1')
        console.log(arg)
    })
    this.$on(['wash_Goods','abcdef'],(arg)=> {
        console.log('执行2') //这个也会被执行
        console.log(arg)
    })
},
methods : {
    emit () {
        this.$emit('wash_Goods',['fish',true,{name:'vue',verison:'2.4'}])
    }
}

这儿的数组也可以这样子理解,当触发按纽的时候,它去寻找需要监听事件时,不管找到的是字符串还是数组,只要监听的事件名字中有相对应的名字,它都会执行。【打个生活中的小例子,哪儿都有你。】 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

vue中关于$emit和$on的使用及说明的更多相关文章

  1. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. vue自定义加载指令v-loading占位图指令v-showimg

    这篇文章主要为大家介绍了vue自定义加载指令和v-loading占位图指令v-showimg的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. vue使用动画实现滚动表格效果

    这篇文章主要为大家详细介绍了vue使用动画实现滚动表格效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. 关于Vue 监控数组的问题

    这篇文章主要介绍了Vue 监控数组的示例,主要包括Vue 是如何追踪数据发生变化,Vue 如何更新数组以及为什么有些数组的数据变更不能被 Vue 监测到,对vue监控数组知识是面试比较常见的问题,感兴趣的朋友一起看看吧

  5. Vue子组件props从父组件接收数据并存入data

    这篇文章主要介绍了Vue子组件props从父组件接收数据并存入data的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. Vue h函数的使用详解

    本文主要介绍了Vue h函数的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. VUE响应式原理的实现详解

    这篇文章主要为大家详细介绍了VUE响应式原理的实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  8. vue+Element ui实现照片墙效果

    这篇文章主要为大家详细介绍了vue+Element ui实现照片墙效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. vue+elemet实现表格手动合并行列

    这篇文章主要为大家详细介绍了vue+elemet实现表格手动合并行列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. iview+vue实现导入EXCEL预览功能

    这篇文章主要为大家详细介绍了iview+vue实现导入EXCEL预览功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部