el-input-number的精度问题

news2024/10/6 10:30:14

前言

el-input-number 饿了么的数字输入框组件,在项目中听常用的。而这个组件比较常用的属性就是精度设置,给组件添加属性precision
其实吧,之前一直没怎么研究,保留几位小数就直接填几就好了,比如保留两位小数,那就填2。但是最近遇到了个需求,需要根据设置好的舍入类型进行舍入,还是以保留两位小数为例:

  • 舍位,不论第三位小数是几都舍弃
  • 进位,不论第三位小数是几都往前进一位
  • 四舍五入,第三位小数,按照四舍五入来决定是进位还是舍位

问题

先看下面的图片:
在这里插入图片描述
从上图可以看到,当第三位数字小于5时无论是组件本身的chang事件还是watch监听事件都不会被触发。当值大于5时才会被触发。另外chang事件是早于watch监听的。

解决

解决思路无非就是在这个数值被组件改变之前,按照设置的舍入类型来处理这个数值。

尝试blur事件
无效,拿到的值已经是按照四舍五入之后的值了。并且blur的事件优先级最低

尝试原生事件

 <el-input-number v-model="inputNum" :precision="2" :step="0.1" :max="10"
       @change="numberChange"  @blur="numberBlue" @input="numInput" v-input />
const vInput = {
    mounted(el, binding) {
        const inputEl = el.getElementsByClassName('el-input__inner')[0];
        // 绑定input事件
        console.log(inputEl);
        inputEl.addEventListener('input', (event) => {
            console.log(event.target.value);
        });
    }
};

注意:

  • @input 这个有问题,1是el-input-number不存在input事件;2是这个input事件不知道绑到哪里去了,无法拿到事件对象,拿到的是已经发生变化的值。所以只能通过指令找到input元素,来添加事件
const numInput = ($event:any) => {
    console.log('原生事件_当前值是:', $event);
};

在这里插入图片描述

  • 点击加减图标,不会触发input输入框上的input事件,这个可以通过提供的属性将两侧的按钮隐藏掉
  • 关于语法糖模式下的自定义指令,之前一直没用过。定义指令对象时,对象名必须以v开头。否则这个指令无效

舍入类型的处理

const vInput = {
    mounted(el, binding) {
        const inputEl = el.getElementsByClassName('el-input__inner')[0]
    /**
     * precision:当前的精度
     * type,舍入类型,'0'(四舍五入),'1'(舍位),'2'(进位)
     */
    const { precision, type } = binding.value

    let newValue = 0
    // 输入框默认四舍五入,因此不处理
    if (type != 0) {
        // 绑定input事件
        inputEl.addEventListener('input', event => {
            // 将当前数值转成字符串,后面添0防止精度不够
            const numStr = (event?.target?.value || 0).toString() + new Array(precision).fill(0).join('')
            // 判断是整数还是实数,整数不处理
            const pointIndex = numStr.indexOf('.')
            if (pointIndex !== -1) {
                // 修改这一位数字,舍位时将这位数字改成0,进位时改成9,四舍五入时不处理
                const newNum = {
                    1: '0',
                    2: '9',
                }

                newValue = parseFloat(numStr.slice(0, pointIndex + precision + 1) + newNum[type])
                // 这里要等输入框失去焦点后再进行赋值
                inputEl.addEventListener('blur', event => {
                    console.log('值:', newValue, precision, newValue.toFixed(precision))
                    event.target.value = parseFloat(newValue.toFixed(precision))
                })
            }
        })
    }
   }
};

效果
下面以保留两位小数,舍入类型为进位为例
在这里插入图片描述

完整代码

<template>
    <div>
       <el-input-number v-model="inputNum" :precision="2" :step="0.1" :max="10"
        :controls="false"
       @change="numberChange"  @blur="numberBlue" @input="numInput" v-input="{
        precision:2,
        type:1
       }" />
    </div>
</template>

<script setup lang="ts">
import { ref, watch } from 'vue';

const inputNum = ref(0);

watch(
    () => inputNum.value,
    (val) => {
        //   console.log('watch监听_值改变了,当前值是:', val);
    }
);

const numberChange = (val:number) => {
    // console.log('change事件_值改变了,当前值是:', val);
};

const numberBlue = () => {
    // console.log('blur事件_当前值:', inputNum.value);
};

const numInput = ($event:any) => {
    console.log('原生事件_当前值是:', $event);
};

const vInput = {
    mounted(el, binding) {
        const inputEl = el.getElementsByClassName('el-input__inner')[0]
    /**
     * precision:当前的精度
     * type,舍入类型,'0'(四舍五入),'1'(舍位),'2'(进位)
     */
    const { precision, type } = binding.value

    let newValue = 0
    // 输入框默认四舍五入,因此不处理
    if (type != 0) {
        // 绑定input事件
        inputEl.addEventListener('input', event => {
            // 将当前数值转成字符串,后面添0防止精度不够
            const numStr = (event?.target?.value || 0).toString() + new Array(precision).fill(0).join('')
            // 判断是整数还是实数,整数不处理
            const pointIndex = numStr.indexOf('.')
            if (pointIndex !== -1) {
                // 修改这一位数字,舍位时将这位数字改成0,进位时改成9,四舍五入时不处理
                const newNum = {
                    1: '0',
                    2: '9',
                }

                newValue = parseFloat(numStr.slice(0, pointIndex + precision + 1) + newNum[type])
                // 这里要等输入框失去焦点后再进行赋值
                inputEl.addEventListener('blur', event => {
                    console.log('值:', newValue, precision, newValue.toFixed(precision))
                    event.target.value = parseFloat(newValue.toFixed(precision))
                })
            }
        })
    }
    }
};
</script>

<style scoped>

</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.mysql内置函数

目录 日期函数 字符串函数 数学函数 其它函数 日期函数 获得当前年月日:

<点云>Bin-picking数据集

题目&#xff1a;工业料仓拣选的大规模6D物体姿态估计数据集 Abstract 介绍了一种新的公共数据集&#xff0c;用于6D对象姿态估计和用于工业bin-picking的实例分割。数据集包括合成场景和真实场景。对于这两者&#xff0c;提供了包括6D姿势 (位置和方向) 的点云、深度图像和注…

【华为机试真题详解JAVA实现】—从单向链表中删除指定值的节点

目录 一、题目描述 二、解题代码 一、题目描述 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。 链表的值不能重复。 构造过程,例如输入一行数据为: 6 2 1 2 3 2 5 1 4 5 7 2 2 则第一个参数6表示输入总共6个节点,…

C++基础语法(内存管理)

我们在学习C语言的时候&#xff0c;可以在栈区中使用内存空间&#xff0c;但栈区的空间毕竟很有限而且随着栈的销毁&#xff0c;该栈里的数据都会被销毁掉。因此我们学习了堆&#xff0c;堆的空间比栈要大很多很多&#xff0c;并且堆区空间的数据&#xff0c;只要我们不主动释放…

STM32 学习笔记_2 下载,GPIO 介绍

下载 Keil 编译例程 编译两个按钮&#xff0c;一个向下是部分编译&#xff0c;两个向下箭头是全部编译。对于未编译文件两个按钮等效。 点击编译后&#xff0c;linking 是链接&#xff0c;结果里面的几个数据的意义代表大小&#xff1a; 数据类型占用Flash or SRAM说明Code…

测试:腾讯云3年轻量2核4G5M服务器CPU内存带宽流量系统盘性能

2核4G云服务器可以选择腾讯云轻量应用服务器&#xff0c;自带5M公网带宽&#xff0c;5M带宽下载速度峰值可达640KB/秒&#xff0c;系统盘为60GB SSD盘&#xff0c;每月500GB流量包&#xff0c;折合每天16GB流量&#xff0c;2核4G5M轻量服务器一年168、198元15个月、三年628元&a…

从存算分离说起:金融行业数据库分布式改造之路

从上世纪90年代正式起步至今&#xff0c;中国数据库发展已走过近30年岁月。以2000年前后为拐点&#xff0c;以MySQL为首的开源数据库&#xff0c;在互联网厂商的推动下&#xff0c;逐步进入生产业务&#xff1b;而为了使单实例能力平庸的MySQL能够满足高性能要求&#xff0c;互…

Vulnhub:Digitalworld.local (JOY)靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.130 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --scripthttp-enum 192.168.111.130 使用enum4linux枚举目标smb服务&#xff0c;发现两个系统用户 enum4linux -a 192.168.111.130 ftp可以匿名登陆&#xff…

基于CH32F203利用TIM1 同时输出4通道固定PWM占空比波形

基于CH32F203利用TIM1 同时输出4通道固定PWM占空比波形&#x1f4cc;相关篇《关于CH32F203程序下载方式说明》&#x1f4cd;有关CH32F203资料手册以及SDK资料&#xff1a;https://www.wch.cn/products/CH32F103.html&#x1f334;《树莓派RP2040 100M 24通道逻辑分析仪开源项目…

相关系数python实现

皮尔逊相关系数的python实现一、相关系数公式二、python实现法1&#xff1a;直接按公式算法2&#xff1a;调用numpy中的corrcoef方法法3&#xff1a;调用scipy.stats中的pearsonr方法法4&#xff1a;调用pandas.Dataframe中的corr方法一、相关系数公式 R的值在-1和1之间&#…

AJAX | 拦截器、文件上传和下载

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; AJAX Ajax即Asynchronous Javascript And XML&#xff08;异步JavaScript和XML&#xff09;&#xff1b;Ajax技术网页应用能够快速地将增量更新呈现在用户界面上&…

Docker 镜像原理

Linux文件系统由bootfs和rootfs两部分组成&#xff1a;- bootfs&#xff1a;包含bootloader&#xff08;引导加载程序&#xff09;和 kernel&#xff08;内核&#xff09;- rootfs&#xff1a; root文件系统&#xff0c;包含的就是典型 Linux 系统中的/dev&#xff0c;/proc&am…

Verilog | 二进制与格雷码

一、格雷码简介 格雷码是一个叫弗兰克格雷的人在 1953 年发明的&#xff0c;最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时&#xff0c;只有一个数据位发生跳变&#xff0c;由于这种特点&#xff0c;就可以避免二进…

基于DSP+FPGA+AD9238的冲击波超压测试系统设计与实现

对冲击波关键特征参数进行可靠、精确地评估是进行军事行动规划的前提和依据&#xff0c; 测试结果可以为战斗部设计提供参考&#xff0c;也可以为武器弹体材料的研发制造提供有效依据。 近年来&#xff0c;随着集成电子技术与软件系统取得突破性成果&#xff0c;冲击波测试技术…

北京筑龙:采购供应链平台-构建能源企业数智供应链的必经之路

4月13至14日&#xff0c;“中国国际管道会议&#xff08;CIPC&#xff09;暨技术装备与成果展”高峰论坛在北京举行。来自国内外管道领域的院士、知名专家、学者齐聚一堂&#xff0c;共同探讨新时代背景下管道技术领域的发展方向。作为采购供应链数字化产品及服务提供商&#x…

涨点神器:卷积变体DCNV2引入Yolov5/Yolov7,助力涨点

1.DCN V2介绍 DCN V2: Improved Deep & Cross Network and Practical Lessons for Web-scale Learning to Rank Systems 论文:https://arxiv.org/abs/2008.13535 作者通过在DCN的基础上,增加了2个创新点,分别是调制模块和使用多个调制后的DCN模块,从形成了DCN的升级版…

tsx零基础页面开发全流程(vue环境)

tsx零基础页面开发全流程&#xff08;vue环境&#xff09;一 注册 tsx 页面二 页面布局绘制三 注册并引入组件三 LogistTrackCard 组件绘制四 LogistTrackCard 组件绘制五 动态数据接驳5.1 tsx | props传递变量与使用变量5.2 tsx | 表达式的灵活使用5.3 tsx | 插槽使用5.4 tsx …

【Linux系统:进程控制】

目录 1 进程创建 1.1 fork函数 1.2 写时拷贝 1.3 fork常规用法 1.4 fork调用失败的原因 2 进程终止 2.1 进程退出场景 2.2 进程常见退出方法 3 进程等待 3.1 进程等待必要性 3.2 进程等待的方法 3.2.1 wait方法 3.2.2 waitpid方法 3.3 获取子进程status 4 进程程序替…

【hello Linux】Linux项目自动化构建工具-make/Makefile

目录 1.make/Makefile的背景 2. 实例代码 2.1 常规代码执行过程&#xff1a; 2.2 使用make工具执行代码程序&#xff1a; 3. makefile文件内容的解释 3.1 生成解决方案 3.2 清理解决方案 4. 多文件的makefile文件书写 5. 缓冲区 Linux&#x1f337; 1.make/Makefile的背景 1. …

淘宝/天猫店铺订单数据导出、销售报表、数据分析

最近有厂商提出想把天猫店铺的数据拿到后台ERP管理系统中&#xff0c;并能实现线下打印电子面单功能。接手这个需求按照度娘给的指引&#xff0c;申请天猫开发者帐号&#xff0c;但是。。。大厂把订单传送接口关了&#xff0c;只对厂商自研软件开放&#xff0c;还需要租用聚石塔…