当前位置:首页 > 技术分析 > 正文内容

vue 基础-组件中事件的触发和监听

ruisui883周前 (04-08)技术分析13

前言

《vue 基础》系列是再次回炉 vue 记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)

vue 中单纯的事件调用,你一定不陌生,简单的写一个 v-on:click=foo() 就可以触发。但组件事件的交互方式可能会遇到些小困难,相信第一次写时一定被事件命名到底驼峰(camelCase)还是短横杠(kebab-case)方式所困惑。

这篇以事件命名展开,讲下组件的事件机制。

事件的最佳命名方式

首先你要明确对事件命名需要使用哪种方式?

它和 props 命名类似,但有不同。props 即使你驼峰命名,模板上也可以通过短横杠方式定义传值的。

先看下驼峰命名方式:

程序如预期执行。但是你要知道可能一时的手误没有大写,或者因为 html 对大小写不敏感,导致事件发送不出去。

这里建议还是统一使用“短横杠”命名方式。这也是官网推荐的。

子组件如何发送事件

使用内置的 this.$emit 方法,代码如下:

v-model 在组件上的使用

应该知道 v-model 是一个语法糖,它包含了数据的绑定和事件的定义。

来看下一个简单的子组件包含 input 元素的实现:

prop 会用一个默认的 value 来接收父组件中 v-model 传来的值,并且 input 事件会随着用户输入触发而发送出去:

父组件定义:

这就是表单 form 中 input 元素上使用 v-model 的简单例子。

非 input 事件

因为 v-model 默认是接收 input 事件的,其他表单事件如何处理?

需要在子组件中特殊指定 model ,来告诉父组件我是 change 的事件:

原生事件绑定修饰符 .native

当我们的子组件,就是一个 input 标签时,父组件尝试绑定 focus 聚焦事件时,却是无反应的。

这时可以通过 .native 修饰符来获取原生事件

但如果子组件是个复杂的 form 表单,或者外面包裹了一层其他标签,即使 .native 也无法子了。

事件监听 $listeners

上面这种情况怎么办呢?这时候就需要使用 $listeners 来放大招了。

vue 专门提供了 this.$listeners 来获取父组件写的事件监听器。来应对上例失效的情况:

上图中注释已经可以说明问题了。我在针对其中细节补充下:

  • 通过自带的 $attrs 来获取父组件模板中额外定义的属性,如,type=text
  • 定义计算属性 inputListeners 返回一个事件监听对象。这个对象以 this.$listeners 为基础可以扩展我们自定义的事件方法。(如上图,定义了 input 以用来使得父模板定义的 v-model 的正常工作)

总结

从组件事件展开,讲了组件上事件的命名方式,同时针对日常编程中常见的 v-model 处理,以及一些特殊的事件问题做了解释说明。

关于我

一名工作在一线的前端工程师,乐于实践,并分享前端开发经验。

关注【前端雨爸】,欢迎评论留言,愿与各位交流进步。

点击 ↙ 了解更多,了解更多前端开发技术文章。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3346.html

标签: kebab-case
分享给朋友:

“vue 基础-组件中事件的触发和监听” 的相关文章

vue3中父子传值、defineProps用法、defineEmits用法

Vue3中新增了一个 script setup 语法糖模式,可以在单文件组件中更简洁地编写组件逻辑。使用 script setup 语法后,props、data、computed、methods 等选项不再需要独立定义,而是可以直接在 setup 函数中声明,代码结构更加清晰,并且可以更方便地使用响...

深入理解Vue.js组件通信:父子组件与子父组件数据交互详解

什么是Vue组件通讯 Vue.js 组件通信是指在 Vue 应用的不同组件之间进行数据交换和状态同步的过程。由于 Vue 的组件是基于单文件组件(SFCs)的模块化设计,每个组件都有自己的作用域,因此它们不能直接访问彼此的数据。为了使组件之间能够协同工作,Vue 提供了几种不同的通信方式。以下是 V...

带你五步学会Vue SSR

作者:liuxuan 前端名狮转发链接:https://mp.weixin.qq.com/s/6K6GUHcLwLG4mzfaYtVMBQ前言SSR大家肯定都不陌生,通过服务端渲染,可以优化SEO抓取,提升首页加载速度等,我在学习SSR的时候,看过很多文章,有些对我有很大的启发作用,有些就只是照搬官...

「干货」FPGA设计中深度约束技巧及调试经验总结

今天跟大家分享的内容很重要,也是我们调试FPGA经验的总结。随着FPGA对时序和性能的要求越来越高,高频率、大位宽的设计越来越多。在调试这些FPGA样机时,需要从写代码时就要小心谨慎,否则写出来的代码可能无法满足时序要求。另外,最近跟网友聊天时,有谈到公众号寿命的问题,我觉得网络交换FPGA公众号应...

你感动了吗?佳能超规格镜头 RF 24-105mm F2.8深度测评

如果要你选一支用作多题材创作的挂机镜头,那我相信很多人会选择24-105mm这个焦段的镜头。作为一支可以实现从广角到长焦的变焦镜头,24-105mm有着丰富的焦段选择。只是基于镜头体积以及光学结构上的限制,此前的24-105mm镜头只能恒定在F4的光圈。而佳能打破了这一限制,将实用焦段和恒定光圈完美...

USB电池充电基础:应急指南

USB为便携设备供电与其串行通信功能一样,已经成为一种标准应用。如今,USB 供电已经扩展到电池充电、交流适配器及其它供电形式的应用。应用的普及带来的一个显著效果是便携设备的充电和供电可以互换插头和适配器。因此,相对于过去每种装置都采用专用适配器的架构相比,目前的解决方案允许采用多种电源进行充电。毋...