【发布时间】:2021-01-06 08:15:45
【问题描述】:
我有一个用于数字输入的文本字段组件。基本上我只是包装 v-text-field 但准备自己实现它。看起来像这样。
<template>
<v-text-field v-model.number = "content" />
</template>
<script>
export default {
name: 'NumericTextField',
props: [ 'value' ],
computed: {
content: {
get () { return this.value },
set (v) { this.$emit('input', f) },
},
}
}
</script>
这已经产生了用户反馈,当文本字段中包含字符串“10.2”,然后在“2”上退格,然后小数位被自动删除时,这很烦人。我想将这种行为更改为“10”。保留在文本字段中。由于我对 Vue 比较陌生,因此我也想从基本原理来理解这一点。
所以我第一次尝试了这个,这是我尝试过的最有启发性的东西。
<template>
<v-text-field v-model="content" />
</template>
<script>
export default {
name: 'NumericTextField',
props: [ 'value' ],
computed: {
content: {
get () { return this.value },
set (v) {
console.log(v)
try {
const f = parseFloat(v)
console.log(f)
this.$emit('input', f)
} catch (err) {
console.log(err)
}
},
},
}
}
</script>
我读到 v-model.number 是基于 parseFloat 的,所以我认为这样的事情一定会发生。所以它确实解决了小数位被自动删除的问题。但是......它甚至不会自动删除多余的字母。因此,如果我输入“10.2A”,即使我看到打印出“10.2”的控制台日志,“A”仍然存在。此外,还有一个更糟糕的错误特征。当我移动到字符串的开头并将其更改为“B10.2”时,它会立即替换为“NaN”。
所以我很想知道很多事情。为什么当我更改为 NaN 时文本正文的主体会立即反应,但当我键入“10.2A”时不会立即反应?相关地,我是如何无意中摆脱自动删除小数位的?我什至还没有到达那部分。所以我误解了Vue中的数据流。
最后,我怎样才能最简单地提供一个文本框,该文本框将评估为放入我的数据模型中的数字,但又没有烦人的小数位自动删除?现有功能不会自动删除尾随字母,所以我猜小数位的自动删除是我的用户不喜欢的故意功能。
【问题讨论】:
标签: vue.js vuetify.js v-model parsefloat