vue form validate 多个input_vue 基础-组件中事件的触发和监听

85e984bcef3f753257378439073c01f0.png

前言

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

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

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

事件的最佳命名方式

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

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

先看下驼峰命名方式:

acbcedfe5f80cb5adf0122ff469a2288.png
9b86135b71a2659fef97c6e659a3a7dc.png

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

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

子组件如何发送事件

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

e65ce67cd71753dcd87a0944a906e277.png

子组件触发,并发送事件

b5b136aa96da936b3ad9433497733cbd.png

触发父组件事件监听

e9b122c3560418417988f2db7cf70821.png

监听函数执行

v-model 在组件上的使用

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

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

58f492549f2b71ec1e3af03d9bd8ee5d.png

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

c72974c57d6f3aa08cc2db72e417ff69.png

父组件定义:

7dcfee40ae68f7b96f89b7e0f1b003b8.png

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

非 input 事件

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

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

fd4dcc543a8a1b5698b1c6382271bf92.png

原生事件绑定修饰符 .native

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

d534fe6b26c917fb81719f3238824dc4.png

子组件

27a70fc8f7e58da98bf38938fe56cdc8.png

父组件

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

64e0fbf867506ff167d52f02bbfa2256.png

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

事件监听 $listeners

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

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

d615f068249cf2cff9b526772477e65c.png

子组件

9147d4e02539bd364f92bb6becb162dd.png

子组件 js 逻辑部分

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

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

总结

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

关于我

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值