「后端小伙伴来学前端了」Vue中自定义事件讲解及组件绑定自定义事件实现通信

简介: 「后端小伙伴来学前端了」Vue中自定义事件讲解及组件绑定自定义事件实现通信

微信截图_20220525213123.png


前言


原本这篇打算写Vue中的那个全局事件总线的原理,但是发现自己少写了这个自定义事件,不讲明白这个自定义事件的操作,不好写全局事件原理,于是就有了这篇文章拉。


一、v-on指令


要讲自定义事件,就得先说说v-on指令。因为v-on就是实现自定义事件的基础。


v-on官网文档


基本介绍


v-on指令可以缩写为@,并且我们使用v-on指令时,其实它有一个默认参数event.

可以和它一起搭配的修饰符大致有以下几种:


  1. .stop - 调用 event.stopPropagation()。 停止冒泡


  1. .prevent - 调用 event.preventDefault()。   阻止默认行为


  1. .capture - 添加事件侦听器时使用 capture 模式。


  1. .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。


  1. .{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。  键修饰符,键别名


  1. .native - 监听组件根元素的原生事件。


  1. .once - 只触发一次回调。


  1. .left - (2.2.0) 只当点击鼠标左键时触发。


  1. .right - (2.2.0) 只当点击鼠标右键时触发。


  1. .middle - (2.2.0) 只当点击鼠标中键时触发。


  1. .passive - (2.3.0) 以 { passive: true } 模式添加侦听器


这些修饰符部分是可以串联起来使用的。


作用:


  • 绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。


  • 用在普通元素上时,只能监听原生 DOM 事件用在自定义元素组件上时,也可以监听子组件触发的自定义事件。


今天第二点才是我们滴重点哈。


示例:


<!-- 方法处理器 -->
<button v-on:click="doThis"></button>
<!-- 动态事件 (2.6.0+) -->
<button v-on:[event]="doThis"></button>
<!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>
<!-- 缩写 -->
<button @click="doThis"></button>
<!-- 动态事件缩写 (2.6.0+) -->
<button @[event]="doThis"></button>
<!-- 停止冒泡 -->
<button @click.stop="doThis"></button>
<!-- 阻止默认行为 -->
<button @click.prevent="doThis"></button>
<!-- 阻止默认行为,没有表达式 -->
<form @submit.prevent></form>
<!--  串联修饰符 -->
<button @click.stop.prevent="doThis"></button>
<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter">
<!-- 键修饰符,键代码 -->
<input @keyup.13="onEnter">
<!-- 点击回调只会触发一次 -->
<button v-on:click.once="doThis"></button>
<!-- 对象语法 (2.4.0+) -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>


在子组件上监听自定义事件 (当子组件触发“my-event”时将调用事件处理器):


<my-component @my-event="handleThis"></my-component>
<!-- 内联语句 -->
<my-component @my-event="handleThis(123, $event)"></my-component>
<!-- 组件中的原生事件 -->
<my-component @click.native="onClick"></my-component>


看了这个v-on之后,不知道大家有没有想起VueComponent实例上的$on,即

vm.$on(event,callback)


  • vm.$on(event,callback)用法


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


在此处,建议大家思考一下他们的区别,因为vm.$on其实就是实现全局事件总线的原理。


二、自定义事件


简单图示:


QQ截图20220525213315.png


我们给在App组件中,通过v-on或者@给A组件绑定一个自定义事件,它的触发时机是等到A组件在内部调用this.$emit(’myevent‘),之后就会触发App组件中的回调。


实际上我们给A组件通过v-on绑定一个自定义事件,其本质就是我们在A组件实例对象VC上绑定了一个事件,事件名字叫我们自定义的名称。


因为我们写了一个组件标签,Vue底层也是要帮我们 new VueComponent()对象。


关于自定义事件名


自定义事件名它不同于组件和prop,事件名不存在任何自动化的大小写转换。只有事件名称完全匹配时才能监听这个事件。


v-on事件监听器在 DOM 模板中会被自动转换为全小写,所以 v-on:myEvent 将会变成 v-on:my-event 从而导致 myEvent不可能被监听到。


vue 始终推荐你始终使用kebab-case的事件名。


三、入门案例


实现效果

微信截图_20220525213349.png


App组件


<template>
  <div id="app">
    <!-- props方法传递 -->
    <Demo :showMsg="showMsg"></Demo>
    <!--绑定自定义事件 send-message:是我们自定义事件名, 后面的sendMessage自定义事件被触发执行的回调函数 -->
    <Demo1 v-on:send-message="sendMessage"></Demo1>
  </div>
</template>
<script>
import Demo from "./components/Demo.vue";
import Demo1 from "./components/Demo1.vue";
export default {
  name: "App",
  components: {
    Demo,
    Demo1,
  },
  methods: {
    showMsg() {
      alert("收到来自demo的信息");
    },
    sendMessage(value) {
      alert("sendMessage自定义事件被触发拉!!!收到来自demo2的信息:" + value);
    },
  },
};
</script>
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>


Demo组件


<template>
  <div class="demo">
    <h1>Demo</h1>
    <p>{{ msg }}</p>
    <button type="button" @click="sendMsg">点击发送消息给App组件</button>
  </div>
</template>
<script>
export default {
  props: {
    showMsg: Function,
  },
  data() {
    return {
      msg: "hello,大家好,我是宁在春",
    };
  },
  methods: {
    sendMsg() {
      this.showMsg();
    },
  },
};
</script>
<style>
.demo {
  width: 200px;
  height: 200px;
  background-color: #1488f5;
}
</style>


demo1


<template>
  <div class="demo1">
    <h1>Demo2</h1>
    <span>{{ msg }}</span>
    <button @click="sendAppMsg(msg)" type="button">
      点击发送消息给App组件
    </button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      msg: "大家好,我是来自Demo2的宁在春",
    };
  },
  methods: {
    sendAppMsg(message) {
      this.$emit("send-message", message);
    },
  },
};
</script>
<style>
.demo1 {
  width: 200px;
  height: 200px;
  background-color: pink;
}
</style>


今天是先写个头,下一节再说全局事件总线的原理。


后语


大家一起加油!!!如若文章中有不足之处,请大家及时指出,在此郑重感谢。


纸上得来终觉浅,绝知此事要躬行。

大家好,我是博主宁在春主页

一名喜欢文艺却踏上编程这条道路的小青年。

希望:我们,待别日相见时,都已有所成


目录
相关文章
|
9月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
741 2
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
1182 1
|
移动开发 前端开发 JavaScript
Vue与React两大前端框架的主要差异点
以上就是Vue和React的主要差异点,希望对你有所帮助。在选择使用哪一个框架时,需要根据项目的具体需求和团队的技术栈来决定。
701 83
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
734 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
JavaScript 前端开发 编译器
Vue与TypeScript:如何实现更强大的前端开发
Vue.js 以其简洁的语法和灵活的架构在前端开发中广受欢迎,而 TypeScript 作为一种静态类型语言,为 JavaScript 提供了强大的类型系统和编译时检查。将 Vue.js 与 TypeScript 结合使用,不仅可以提升代码的可维护性和可扩展性,还能减少运行时错误,提高开发效率。本文将介绍如何在 Vue.js 项目中使用 TypeScript,并通过一些代码示例展示其强大功能。
506 22
|
SQL JavaScript 安全
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
648 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1574 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
1001 0
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架

热门文章

最新文章