element-ui :封装el-input 遇到的问题
admin
2024-02-12 15:41:57
0

因项目中有多处输入框要求只能输入整数或者浮点数, el-input 设置type=number 火狐浏览器这个属性是无效的; 所以就想到了 使用el-input type=text 输入的时候 正则匹配, 只能输入整数或者浮点数; 所以为了方便使用,需要对第三方库el-input 进行封装。

1. 初始封装的组件Number-input.vue 代码如下:


封装第三方组件主要用到 $atrrs 和 $listeners 

v-bind="$attrs" v-on="$listeners" 

 $atrrs:接收父组件传过来的非class 和 style , 并且未在props  中注册使用的属性 

$listeners :接收父组件传过来的非native 的事件

(注:.native 事件是父组件本身的事件, 在vue 中.native 只能用于组件上,.native 修饰符的作用是:在一个组件的根元素上直接监听一个原生事件; 原生的标签上不能使用 比如直接在 会报错)

2. 父组件 Add.vue  中使用

 

 上述使用目前为止都是正常的;

然后突然发现另外一个同事使用的时候 ,出现了问题!!!

在封装的组件Number-input.vue中多写一个属性为了接收父组件传过来的事件再传给下一级:v-on="$listeners"

和上述对比 导致除了数字其他还能输入

原因就是 el-input 源码中 通过 v-on="$listeners" 接收了 业务组件Add.vue 传过来的事件, Add.vue 使用v-model 实现双向绑定, 默认有一个input 事件; 所以 当输入框输入数据的时候 , el-input 源码 中 触发input 事件, 同时向外触发 this.$emit('input', event.target.value) , 这个会先后触发Number-input.vue 和 Add.vue 中的 input事件; Add.vue中默认的input 事件接收的是 el-input 源码中传过来的原始值,会覆盖掉 Number-input.vue 中传过来的值, 最终v-model 中的值接收的也是el-input 源码中传过来的原始值. 

el-input 源码
handleInput(event) {// should not emit input during composition// see: https://github.com/ElemeFE/element/issues/10516if (this.isComposing) return;// hack for https://github.com/ElemeFE/element/issues/8548// should remove the following line when we don't support IEif (event.target.value === this.nativeInputValue) return;console.log('el-input input事件====', event)this.$emit('input', event.target.value);// ensure native input value is controlled// see: https://github.com/ElemeFE/element/issues/12850this.$nextTick(this.setNativeInputValue);},

知道了原因所在,如何修复该问题:

1. Number-input 组件中的@input 和 @change事件 添加.native , 这样的话 el-input 源码中的 $emit('input' 就不会触发这两个事件 ; 这两个事件 会添加到 组件的根元素上 ; 看 el-input 源码可知 会添加到最外层的div 上; 然后 当我们输入数据的时候 ,首先$emit('input' 触发的是Add.vue 中的input 事件改变value 值;接着 通过冒泡 会触发父元素上的input 和 change事件, 在这 两个事件中 手动又去触发了 add.vue 中的input 事件(这个主要是自己怎么写), 改变了 value 值, 最终改了输入框的值

2. Number-input.vue中监听value 值的变化 类似下面: 但是这种 不能 区分是input 还是change事件

watch: {value: {handler(val, oldV) {let reg = ''if(this.maxPrecision === Infinity) {// this.$emit('input', val)reg  = new RegExp(`^\\D*(\\d*(?:\\.\\d{0,20})?).*$`, 'g')this.$emit('input', val.replace(reg ,'$1'))} else if(this.maxPrecision >= 0) {//  正则不能输入最大位数reg  = new RegExp(`^\\D*(\\d*(?:\\.\\d{0,${this.maxPrecision}})?).*$`, 'g')this.$emit('input', val.replace(reg ,'$1'))}val = val.replace(reg ,'$1')this.$emit('input', val)}}},

相关内容

热门资讯

安卓系统不推送更新,揭秘背后的... 最近是不是发现你的安卓手机有点儿“懒”啊?更新推送总是慢吞吞的,让人等得花儿都谢了。别急,今天就来给...
ape格式转换安卓系统,享受音... 你有没有想过,你的安卓手机里的ape格式音乐文件,竟然可以通过一个小小的转换,焕发出全新的生命力?没...
获取安卓系统加载器,核心功能与... 你有没有想过,你的安卓手机里那些神奇的软件和游戏是怎么被安装到你的设备上的呢?没错,就是通过一个叫做...
安卓系统文件夹在哪,安卓系统文... 你有没有遇到过这样的情况:手机里乱糟糟的,想找个文件却找不到?别急,今天就来给你揭秘安卓系统文件夹的...
安卓手感最好的裸机系统,安卓手... 安卓手感最好的裸机系统:探索极致体验的秘密武器在数字世界中,我们常常被各种功能和复杂操作所包围,尤其...
nas如何刷回安卓系统,轻松刷... 你有没有想过,你的NAS(网络附加存储)突然间变成了一个安卓的小天地?别急,这可不是什么天方夜谭,而...
荣耀沿用的安卓系统吗,打造个性... 你有没有注意到,最近荣耀的新机发布,大家都在热议一个问题:荣耀沿用的安卓系统吗?这可是个让人好奇不已...
快麦erp系统安卓下载,一键下... 你有没有听说最近一款叫做快麦ERP系统的软件在安卓平台上大受欢迎呢?没错,就是那个能让你企业管理如虎...
华为安卓系统下载app,一步到... 你有没有发现,最近华为手机的用户们都在忙活一件大事儿?没错,那就是下载安卓系统上的各种app啦!这可...
原生安卓系统游戏模式,畅享沉浸... 亲爱的手机游戏爱好者们,你是否曾为手机游戏运行不畅而烦恼?又或者,你是否渴望在游戏中获得更极致的体验...
安卓9改系统语言设置,轻松切换... 你有没有发现,手机里的语言设置有时候真的让人头疼?比如说,你突然想用一下安卓9的系统语言设置,结果发...
怎么升级安卓最新系统,畅享安卓... 亲爱的手机控们,你是不是也和我一样,对安卓系统的更新充满了期待?每次系统升级,都仿佛给我们的手机带来...
安卓系统电视跳舞毯,家庭娱乐新... 你有没有想过,家里的电视除了用来追剧、看电影,还能变成一个充满活力的娱乐中心?没错,我要给你介绍的就...
安卓系统维护周期,全方位守护您... 亲爱的手机控们,你是不是也和我一样,对安卓系统的维护周期充满了好奇呢?毕竟,我们的手机可是我们日常生...
安卓系统电脑怎么往下滑,一扫即... 你有没有发现,用安卓系统电脑的时候,有时候屏幕上会出现一些小图标或者应用,你想要快速浏览或者切换,却...
手机中判断安卓系统苹果系统js... 你有没有想过,你的手机里到底装的是安卓系统还是苹果系统呢?这可不是一个小问题哦,因为不同的系统,就像...
window系统和安卓系统还原... 你有没有遇到过手机或电脑突然卡顿,或者不小心删掉了重要的文件?别急,今天就来给你详细说说如何让win...
安卓系统打电话变声器,轻松实现... 安卓系统打电话变声器:探索数字时代的通信革新在数字化浪潮中,智能手机已经成为我们生活中不可或缺的一部...
android系统和安卓哪个好... 说到手机操作系统,你是不是也和我一样,对Android系统和安卓系统傻傻分不清楚呢?别急,今天就来给...
米柚系统是不是安卓,基于安卓的... 亲爱的读者,你是否曾在手机的选择上犹豫不决,尤其是当面对那些自称是安卓系统但又有自己特色的操作系统时...