简体   繁体   English

使用 TypeScript 限制 Vue 中的数字输入值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM