el-input无法绑定键盘事件?浅析.native修饰符的作用与原理(绊脚石系列)

在开始说明为什么el-input无法绑定键盘事件之前,我们需要一点铺垫

native介绍

我们在使用vue进行开发时,会有很多不同的组件,它们作为一个个标签填充在template模板中,你是否想过,这些组件既然是标签,那么它们能否监听html标签的各种事件呢?

结果是不能,原因在于这些组件虽然看上去和html标签一样,用法也和html标签一样,但实际上,它们只是子组件中真实html标签的一个载体而已,并不存在于真实dom中,既然不存在于真实dom中,那么当然也不能监听html标签的原生事件啦。

针对这种情况,Vue给我们提供了一个事件修饰符:.native ,它允许我们在自定义的组件标签中添加原生的DOM事件。

<template>
  <div>
    <!-- 组件直接绑定click事件,Vue会把click视为一个自定义事件 无法通过点击触发 -->
    <MyComponent @click="handleClick()"></MyComponent> 
    <!-- 添加.native事件之后,Vue就可以识别出来这是一个原生的DOM事件:click事件 -->
    <MyComponent @click.native="handleClick()"></MyComponent> 
  </div>
</template>

el-input为什么无法绑定键盘事件?

如果你认真看完了上面的铺垫知识,其实答案已经出来了:<el-input>标签其本质上是一个组件。

想想看,我们在刚刚学习html标签的时候,什么时候学过这种不守浏览器道的奇怪标签?很明显,<el-input>实际上就是一个组件,它被解析成html结构是这样的:

我们给<el-input>添加@keydown事件时,keydown只能被解析为自定义事件,我们需要通过$emit手动触发该事件的回调函数才行。

而.native修饰符,就是为了这种情况而出现的,当我们使用了此修饰符后,vue会帮我们给组件的根标签添加一个事件监听器,我们便可以正常使用该事件了。

所以解决方法就是:在<el-input>绑定@keydown事件时,添加.native修饰符即可。

同理,其他的element组件也是可以用这个方法来绑定原生DOM事件的。也许你还有疑问:那为什么<el-button>的@click事件就不用.native 修饰符呢?

答案也很简单,因为人家在创建组件时就为<el-button>里面的<button>标签绑定了一个click事件,相当于是官方提前为我们准备好了一个click接口,我们看似是在调用原生js的click事件,实际上是在调用element官方为我们提前准备好的方法。

总结

  1. <el-input>本质是一个组件,所有组件都无法直接绑定原生DOM事件,elementUI可以直接写click等原生事件其实是因为ele官方为我们提前预置了一些相关事件。(没有预置的我们就无法直接绑定相关事件了,正如 <el-input> 没有预置keydown事件)
  2. 想要为组件标签绑定原生DOM事件,需要用到 .native 修饰符,其原理是Vue内部为组件的根标签中绑定了一个事件侦听器。
  3. .native是Vue官方专门为组件标签准备的语法,所以 .native 不能用在 非组件标签 上,否则会引发 warn 警告,并且该事件会失效。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 el-input 组件中,可以使用修饰符 .native 来解决这个问题。例如: ``` <el-input v-model="value" @clear.native="onClear"></el-input> ``` 这样,在点击清除按钮时,就不会触发 click 事件了。 如果你想要在点击清除按钮时,触发一个自定义的事件,可以这样写: ``` <el-input v-model="value" @clear="onClear"></el-input> ``` 然后在组件的 methods 中添加 onClear 方法,就可以在点击清除按钮时触发自定义的事件了。 ``` methods: { onClear() { // 自定义的处理逻辑 } } ``` 希望这个答案对你有帮助! ### 回答2: 在el-input组件中,点击clear按钮会触发input的click事件,如果想要禁止点击clear按钮触发click事件,可以通过以下方法实现: 1. 使用事件修饰符el-input上添加@click.native事件,将事件修饰符.native用于监听原生click事件。如下所示: ```html <el-input @click.native.stop></el-input> ``` 使用.stop修饰符应该可以阻止click事件的冒泡,但在el-input的clear按钮上,由于click事件是通过原生DOM事件处理的,所以.stop修饰符对clear按钮上的click事件无效。 2. 使用事件委托 可以通过在el-input中添加一个父容器,将click事件委托给父容器进行处理。如下所示: ```html <div @click="handleInputClick"> <el-input></el-input> </div> ``` 然后在methods中定义handleInputClick方法,点击clear按钮时不触发click事件。 ```js methods: { handleInputClick(event) { if (event.target.className !== "el-input__clear") { // 处理click事件 } } } ``` 在handleInputClick方法中通过判断event.target.className是否是"el-input__clear",如果是则不处理click事件。 通过以上两种方法,可以禁止clear按钮触发click事件。 ### 回答3: 在el-input组件中,clear按钮的click事件实际上是由父组件的@click事件监听器处理的。当触发点击事件时,会先执行子元素(clear按钮)的点击事件,然后再执行父元素(el-input组件)的点击事件。 如果你希望clear按钮的点击事件不触发父级组件的点击事件,可以通过以下两种方式进行处理: 1. 通过事件修饰符.prevent.stop:在父组件的@click事件监听器中,将事件修饰符修改为.prevent.stop。这样,当点击clear按钮时,不仅会阻止父组件的点击事件冒泡,还会阻止默认行为,即清除输入框的文本内容。 ```html <el-input @click.prevent.stop="handleInputClick" clearable></el-input> ``` 2. 使用事件修饰符.native.stop:在el-input组件上添加事件修饰符.native.stop,这样会将@click事件直接绑定到clear按钮上,而不是通过父组件的@click事件监听器处理。 ```html <el-input @click.native.stop="handleClearClick" clearable></el-input> ``` 注意:如果以上两种方法都无效,可能是因为其他地方的事件监听器阻止了点击事件冒泡,或者在点击事件处理函数中,通过event.stopPropagation()方法阻止了事件冒泡。请检查代码逻辑,确保没有其他地方阻止了事件冒泡。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值