element ui的el-input-number修改数值失效的问题及解决

 更新时间:2022年05月23日 15:01:12   作者:Beam007  
这篇文章主要介绍了element ui的el-input-number修改数值失效的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

element ui的el-input-number修改数值失效

问题代码

目的:实现去掉小数位。

<el-input-number v-model="cycle" @change="vaidateCycle" :min="1" :max="3600"></el-input-number>
vaidateCycle () {
    let re = /^[0-9]+$/
    if (!re.test(this.cycle)) {
        this.$message.error('请输入1~3600之间的正整数!')
        this.cycle = parseInt(this.cycle)
    }
}

当在输入框输入12.3时,光标移开触发change事件,输入框的值会变成12;

再次反复操作,输入12.3,光标移开触发change事件,输入框的值仍然是12.3;

总之输入框能不能祛除小数位不可控。

解决办法

只需使用$nextTick函数,改为如下即可:

<el-input-number v-model="cycle" @change="vaidateCycle" :min="1" :max="3600"></el-input-number>
vaidateCycle () {
    let re = /^[0-9]+$/
    if (!re.test(this.cycle)) {
        this.$message.error('请输入1~3600之间的正整数!')
        this.$nextTick(() => {
            this.cycle = parseInt(this.cycle)
        })
    }
}

分析说明

el-input-number是element的一个组件,并非简单的标签,而change事件监听的是整个组件。

也就是说,光标移开触发change事件,此时cycle值为12.3,马上触发dom更新。

此时修改了cycle的值,祛除了小数位。(当前组件已经被监测到变化,已经触发了重新渲染dom,此时再修改并不会再次渲染dom。)

导致dom更新在前,cycle的值取整操作在后,并且此后无刷新控制dom重新渲染的指令。

所以dom上挂载显示的值仍然是12.3,但是console.log(this.cycle)的值为12。

此时需要用到$nextTick函数,即在dom初次完成渲染挂载后,修改其值再次触发dom渲染挂载。

官方资料

异步更新队列:

可能你还没有注意到,Vue 异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。

如果同一个 watcher 被多次触发,只会被推入到队列中一次。

这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。

然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MessageChannel,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。

需要用的$nextTick()的情况:

1、你在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。原因是什么呢,原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。

2、在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进Vue.nextTick()的回调函数中。

最新说明

目前element更新到2.13.2版本可以通过“precision数值精度”去控制了。

<el-input-number size="mini" class="just-full-width" v-model="cycle" :min="1" :max="3600" :precision="0"></el-input-number>

但是有个弊端,就没有填错的提示了…

el-input-number组件无法修改默认值为空

<el-input-number v-model="num"  :min="1" :max="10" label="描述文字"></el-input-number>

当num设置为 null 或者 ""  都不能将输入框的值变为空

后来发现 将num 设置为  undefined

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue前端页面数据加载添加loading效果的实现

    vue前端页面数据加载添加loading效果的实现

    这篇文章主要介绍了vue前端页面数据加载添加loading效果的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】

    vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】

    这篇文章主要介绍了vue自定义键盘信息、监听数据变化的方法,结合实例形式分析了vue.js基于vm.$watch进行事件监听相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Vue路由组件通过props配置传参的实现

    Vue路由组件通过props配置传参的实现

    本文主要介绍了Vue路由组件通过props配置传参的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 详解Vue单元测试Karma+Mocha学习笔记

    详解Vue单元测试Karma+Mocha学习笔记

    本篇文章主要介绍了详解Vue单元测试Karma+Mocha学习笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • vue中根据时间戳判断对应的时间(今天 昨天 前天)

    vue中根据时间戳判断对应的时间(今天 昨天 前天)

    这篇文章主要介绍了vue中 根据时间戳 判断对应的时间(今天 昨天 前天),需要的朋友可以参考下
    2019-12-12
  • vue3点击按钮下载文件功能的代码实现

    vue3点击按钮下载文件功能的代码实现

    在写vue项目时,有个需求是点击表格中某一行的下载按钮,然后开始下载这一行对应的文件,所以本文小编给大家介绍了使用vue3实现点击按钮下载文件功能,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-01-01
  • Vue数字输入框组件示例代码详解

    Vue数字输入框组件示例代码详解

    很多朋友经常遇到这样的功能,只允许输入数字,允许设置初始值、最大值、最小值,今天小编给大家分享示例代码给大家介绍vue数字输入框功能,感兴趣的朋友一起看看吧
    2020-01-01
  • 深入了解Vue动态组件和异步组件

    深入了解Vue动态组件和异步组件

    这篇文章主要介绍了深入了解Vue动态组件和异步组件的相关资料,帮助大家更好的理解和学习vue组件的相关知识,感兴趣的朋友可以了解下
    2021-01-01
  • 关于vue中 $emit的用法详解

    关于vue中 $emit的用法详解

    这篇文章主要介绍了vue中 $emit的用法,通过实例代码给大家介绍了子组件和父组件的相关知识,需要的朋友参考下吧
    2018-04-04
  • 浅谈Vue服务端渲染框架Nuxt的那些事

    浅谈Vue服务端渲染框架Nuxt的那些事

    这篇文章主要介绍了浅谈Vue服务端渲染框架Nuxt的那些事,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12

最新评论