[英]Limiting number input value in Vue with TypeScript
I have the following component:我有以下组件:
<input class="number-input py-1 primary--text font-weight-regular"
:ref="'number-input-' + title"
@keypress="onKeyPressed"
:disabled="disabled"
type="number"
v-model="result"
:min="minimum"
:max="maximum"
/>
import { Component, Prop, Vue } from 'vue-property-decorator'
import { floatFixedNumber } from '@/common/utils'
@Component({
name: 'NumberInput'
})
export default class NumberInput extends Vue {
@Prop({ type: String }) title!: string | null
@Prop({ type: Number }) value!: number
@Prop({ type: Boolean, default: false }) focused!: boolean
@Prop({ type: Number, default: 0 }) minAllowed!: number
@Prop({ type: Number, default: 999 }) maxAllowed!: number
@Prop({ type: Boolean, default: false }) disabled!: boolean
get result (): number {
return this.validateValue(this.value)
}
set result (value: number) {
if (!this.disabled) {
this.$emit('on-change', this.validateValue(value))
}
}
get minimum (): number {
return this.minAllowed === null ? 0 : this.minAllowed
}
get maximum (): number {
return this.maxAllowed === null ? 999 : this.maxAllowed
}
onKeyPressed () {
this.$nextTick(() => {
this.$forceUpdate()
})
}
validateValue (value: string | number | null): number {
value = Number(value)
value = isNaN(value) ? 0 : value
value = value < this.minimum ? this.minimum : value > this.maximum ? this.maximum : value
return floatFixedNumber(value)
}
mounted () {
if (this.focused && this.$refs['number-input-' + this.title]) {
(this.$refs['number-input-' + this.title] as HTMLElement).focus()
}
}
}
What I want is to set maximum allowed typed number to 999. With the code above, it does set the number, however in the input field I can still type 9999, even if the max number is set to 999.我想要的是将最大允许输入的数字设置为 999。使用上面的代码,它确实设置了数字,但是在输入字段中我仍然可以输入 9999,即使最大数字设置为 999。
I already tried the following:我已经尝试了以下方法:
get result (): number {
const num = this.validateValue(this.value) > this.maximum ? this.maximum : this.validateValue(this.value)
return num
}
onKeyPressed (event:any) {
const val = this.validateValue(event?.target.value)
if (val > this.maximum) {
this.result = this.maximum
} else {
this.$nextTick(() => {
this.$forceUpdate()
})
}
}
And I tried this:我试过这个:
onKeyPressed (event:any) {
const val = this.validateValue(event?.target.value)
if (val > this.maximum) {
(this.$refs['number-input-' + this.title] as HTMLInputElement).value = this.maximum.toString()
} else {
this.$nextTick(() => {
this.$forceUpdate()
})
}
}
However the user is still being able to type 9999 in the field, even though it counts only 999. How do I prevent this and allow him to type (or to see in the input field) only up to 999?然而,用户仍然可以在字段中输入 9999,即使它只计数 999。我如何防止这种情况并允许他输入(或在输入字段中查看)最多 999?
<input class="number-input py-1 primary--text font-weight-regular":ref="'number-input-' + title" @keydown="onKeyPressed($event)":disabled="disabled" type="number" v-model="result":min="minimum":max="maximum" /> onKeyPressed: (e: KeyboardEvent) => { const el: HTMLInputElement = (e.target as HTMLInputElement)?? null; if (el && el.value.length > 3) { e.preventDefault(); } };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.