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)}}},

相关内容

热门资讯

电视安卓系统哪个品牌好,哪家品... 你有没有想过,家里的电视是不是该升级换代了呢?现在市面上电视品牌琳琅满目,各种操作系统也是让人眼花缭...
安卓会员管理系统怎么用,提升服... 你有没有想过,手机里那些你爱不释手的APP,背后其实有个强大的会员管理系统在默默支持呢?没错,就是那...
安卓系统软件使用技巧,解锁软件... 你有没有发现,用安卓手机的时候,总有一些小技巧能让你玩得更溜?别小看了这些小细节,它们可是能让你的手...
安卓系统提示音替换 你知道吗?手机里那个时不时响起的提示音,有时候真的能让人心情大好,有时候又让人抓狂不已。今天,就让我...
安卓开机不了系统更新 手机突然开不了机,系统更新还卡在那里,这可真是让人头疼的问题啊!你是不是也遇到了这种情况?别急,今天...
安卓系统中微信视频,安卓系统下... 你有没有发现,现在用手机聊天,视频通话简直成了标配!尤其是咱们安卓系统的小伙伴们,微信视频功能更是用...
安卓系统是服务器,服务器端的智... 你知道吗?在科技的世界里,安卓系统可是个超级明星呢!它不仅仅是个手机操作系统,竟然还能成为服务器的得...
pc电脑安卓系统下载软件,轻松... 你有没有想过,你的PC电脑上安装了安卓系统,是不是瞬间觉得世界都大不一样了呢?没错,就是那种“一机在...
电影院购票系统安卓,便捷观影新... 你有没有想过,在繁忙的生活中,一部好电影就像是一剂强心针,能瞬间让你放松心情?而我今天要和你分享的,...
安卓系统可以写程序? 你有没有想过,安卓系统竟然也能写程序呢?没错,你没听错!这个我们日常使用的智能手机操作系统,竟然有着...
安卓系统架构书籍推荐,权威书籍... 你有没有想过,想要深入了解安卓系统架构,却不知道从何下手?别急,今天我就要给你推荐几本超级实用的书籍...
安卓系统看到的炸弹,技术解析与... 安卓系统看到的炸弹——揭秘手机中的隐形威胁在数字化时代,智能手机已经成为我们生活中不可或缺的一部分。...
鸿蒙系统有安卓文件,畅享多平台... 你知道吗?最近在科技圈里,有个大新闻可是闹得沸沸扬扬的,那就是鸿蒙系统竟然有了安卓文件!是不是觉得有...
宝马安卓车机系统切换,驾驭未来... 你有没有发现,现在的汽车越来越智能了?尤其是那些豪华品牌,比如宝马,它们的内饰里那个大屏幕,简直就像...
p30退回安卓系统 你有没有听说最近P30的用户们都在忙活一件大事?没错,就是他们的手机要退回安卓系统啦!这可不是一个简...
oppoa57安卓原生系统,原... 你有没有发现,最近OPPO A57这款手机在安卓原生系统上的表现真是让人眼前一亮呢?今天,就让我带你...
安卓系统输入法联想,安卓系统输... 你有没有发现,手机上的输入法真的是个神奇的小助手呢?尤其是安卓系统的输入法,简直就是智能生活的点睛之...
怎么进入安卓刷机系统,安卓刷机... 亲爱的手机控们,你是否曾对安卓手机的刷机系统充满好奇?想要解锁手机潜能,体验全新的系统魅力?别急,今...
安卓系统程序有病毒 你知道吗?在这个数字化时代,手机已经成了我们生活中不可或缺的好伙伴。但是,你知道吗?即使是安卓系统,...
奥迪中控安卓系统下载,畅享智能... 你有没有发现,现在汽车的中控系统越来越智能了?尤其是奥迪这种豪华品牌,他们的中控系统简直就是科技与艺...