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

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

ruisui882个月前 (04-08)技术分析31

前言

《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 基础-组件中事件的触发和监听” 的相关文章

一起学Vue:路由(vue-router)

前言学习vue-router就要先了解路由是什么?前端路由的实现原理?vue-router如何使用?等等这些问题,就是本篇要探讨的主要问题。vue-router是什么路由是什么?大概有两种说法:从路由的用途上来解释路由就是指随着浏览器地址栏的变化,展示给用户的页面也不相同。从路由的实现原理上来解释路...

vue 开发规范

项目运行指南(#项目运行指南)开发本地环境(#开发本地环境)开发相关插件/工具(#开发相关插件工具)开发规范(#开发规范)vue(#vue)【数据流向】(#数据流向)【慎用全局注册】(#慎用全局注册)【组件名称】(#组件名称)【组件中的 CSS】(#组件中的-css)【统一标签顺序】(#统一标签顺序...

uni-app基于vue开发小程序与标准vue开发新增点

1、路由跳转传参uni.navigateTo({ url: `/pages/transition/spreadTextAction?t=${this.options.t}&rt=${this.options.rt}&l=${this.options.l}`});uni.navigateBack({...

Alpine.js 如何火起来的!比 React/Vue 如何?

大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!前言前端 JavaScript 框架的创新是这个时代最伟大的技术文化现象之一。Alpine 发音为 /??lpa?n/,中文为阿尔卑斯山、...

嵌入式实操——基于RT1170 使能SEMC配置SDRAM功能(八)

本文主要是通过迁移的思维,记录本人初次使用NXP MCUXpresso SDK API进行BSP开发MCUXpresso SDK SEMC API 接口链接  在MCUXpresso SDK 框架下提供了对SEMC DDR进行操作的接口。学习链接:https://community.nxp.com/...

微信将研发“应用号”体系 或成为App大杂烩应用

Akiha发表于 2016-01-11 18:11微信正在探讨一种新的公众号形态,即在现有的订阅号、服务号之外,再研发新的“应用号”体系。让用户不必去装各种 App,在微信里就能实现各种服务、功能;关注后,“应用号”平时不向用户发送消息,需要时,用户再去点开“应用号”等。目前,微信钱包内已有的服务,...