vue 中 input v-model中的坑 及 限制number的长度

本文探讨了Vue中v-model.number的使用误区,特别是在处理长数字时可能出现的数据精度问题,并提供了解决方案,如限制输入长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

v-model.number 存在的坑

<input type="number" v-model='order'> //在输入值 在输出的时候会被转换为string类型

想要输入的内容依然是数字

<input type="number" v-model.number='order'> 

输出的时候是Number类型,因为在内部帮你把数据做了转化Number(order) 输出,
但此时会埋下一个大坑:

Number('152845125481254538') // 152845125481254530
Number('152845125481254532') // 152845125481254530
Number('152845125481254534') //152845125481254530
Number('152845125481254523') // 152845125481254530

看到这里就会发现 Number() 转化后数据会发生改变,所以在使用v-model.number数据会发生不可控制的改变

限制number的输入长度

<input type="number" v-model='order' ref='order' @input='limitOrder'>
limitOrder () {
	// 要做长度判断
    if (this.$refs.order.value.length > 11) {
      this.$refs.order.value = this.$refs.order.value.slice(0, 18)
      this.order = this.$refs.order.value
    }
 },

存在的坑: 从数据中间删除某个数字,焦点会自动跳到最后一个,所以要做长度的判读,如果长度未达到你所要限制的长度的话,就不需要截取。

### Vue.js 中 v-model 的用法及实现原理 #### 1. v-model 的基本用法 v-modelVue.js 中实现双向数据绑定的核心指令,主要用于表单元素和组件之间的数据同步。它简化了 `v-bind` 和 `v-on` 的组合使用,使得开发者可以更方便地实现数据与视图的同步更新[^2]。 以下是一个简单的例子,展示了如何在输入框中使用 v-model: ```html <div id="app"> <input type="text" v-model="message"> {{ message }} </div> <script> const app = new Vue({ el: '#app', data: { message: "hello" } }); </script> ``` 在这个例子中,当用户在输入框中输入内容时,`message` 的值会随之更新;反之,如果通过代码修改 `message` 的值,输入框中的内容也会相应变化[^4]。 #### 2. v-model 的实现原理 v-model 的本质是通过语法糖的形式将 `v-bind` 和 `v-on` 结合起来。对于普通的表单元素(如 `<input>`、`<textarea>`、`<select>`),v-model 实际上是以下两者的结合: - 使用 `v-bind` 将元素的值绑定到 Vue 实例中的数据属性。 - 使用 `v-on` 监听用户的输入事件,并将输入的值更新到 Vue 实例中的数据属性。 例如,上述代码等价于以下写法: ```html <div id="app"> <input type="text" :value="message" @input="message = $event.target.value"> {{ message }} </div> ``` 对于自定义组件,v-model 的实现稍有不同。Vue 3 中,v-model 支持自定义模型名称,并通过 `modelValue` 和 `update:modelValue` 进行数据传递[^3]。以下是一个自定义组件的例子: ```html <!-- MyInput.vue --> <template> <input :value="modelValue" @input="emit('update:modelValue', ($event.target as HTMLInputElement).value)"> </template> <script lang="ts"> defineProps(['modelValue']); const emit = defineEmits(['update:modelValue']); </script> ``` #### 3. v-model 的修饰符 为了更好地控制数据同步行为,Vue 提供了一些内置修饰符,常用的包括: - `.lazy`:将数据更新从 `input` 事件延迟到 `change` 事件。 - `.number`:自动将输入值转换为数字类型。 - `.trim`:自动去除输入值的首尾空格。 例如: ```html <input v-model.lazy="message"> <input v-model.number="age"> <input v-model.trim="name"> ``` #### 4. 组件间的 v-model 使用 在父组件和子组件之间,v-model 可以用于实现父子组件的数据传递。默认情况下,v-model 会在子组件中绑定名为 `modelValue` 的 prop,并监听 `update:modelValue` 事件。 例如: ```html <!-- 父组件 --> <template> <child-component v-model="parentMessage"></child-component> </template> <script> export default { data() { return { parentMessage: 'Hello from parent' }; } }; </script> <!-- 子组件 --> <template> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"> </template> <script> export default { props: ['modelValue'] }; </script> ``` ### 总结 v-modelVue.js 中实现双向数据绑定的重要工具,其核心思想是通过语法糖的形式将 `v-bind` 和 `v-on` 结合起来。无论是普通表单元素还是自定义组件,v-model 都能提供简洁而强大的数据同步机制。理解 v-model 的实现原理及其修饰符的使用,能够帮助开发者编写出更加高效和易维护的代码[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值