v-text-field 在输入后返回字符串,即使它有类型号

Posted

技术标签:

【中文标题】v-text-field 在输入后返回字符串,即使它有类型号【英文标题】:v-text-field returns string after typing even though it has type number 【发布时间】:2019-12-08 02:03:15 【问题描述】:
<VTextField
                :value="addOnStartingPrice"
                solo
                outline
                reverse
                append-icon="attach_money"
                type="number"
                min="0"
                step="any"
                @input="$emit('update:addOnStartingPrice', $event)"
              />

我有这样的东西。

问题1)只要我更改数字或输入它,它就会正确抛出数字值,但它的类型是字符串而不是数字,因此类型检查失败。如何让它以 type:number 的形式返回值?

问题 2) step="any" and min="0" 到底是做什么的?我猜它们不起作用,因为我也可以输入负数。

【问题讨论】:

【参考方案1】:

确实 vuetify 返回字符串。作为一种解决方法,您可以使用number modifier.

<v-text-field type="number" v-model.number="computedAddOnStartingPrice" />

你可以有一个这样的计算属性:

computed: 
  computedAddOnStartingPrice: 
    get ()  return this.addOnStartingPrice ,
    set (newVal)  this.$emit('update:addOnStartingPrice', newVal) 
  

根据step 属性读取html input step。

对于min attr 读取Html input min

您还可以使用vuetify rules 来检查用户是否输入了正数。示例:

    <v-text-field
      type="number"   
      step="any"
      min="0"
      :rules="[numberRule]"
      v-model.number="computedAddOnStartingPrice"
    ></v-text-field>

numberRule:

  data: () => (
    //...
    numberRule: val => 
      if(val < 0) return 'Please enter a positive number'
      return true
    
  )

See it in action

【讨论】:

我不能拥有 v-model。我正在使用 :value 道具。它可以作为:value.number 完成吗?我不这么认为。 是的,您可以拥有 v-model。删除:value,添加一个 v-model 和一个计算属性,如我在答案中所示。【参考方案2】:

只需在@input 处理程序中转换为Number

<VTextField
  :value="addOnStartingPrice"
  solo
  outline
  reverse
  append-icon="attach_money"
  type="number"
  min="0"
  step="any"
  @input="$emit('update:addOnStartingPrice', Number($event))"
  />

【讨论】:

【参考方案3】:

作为 InputElements 的 value 属性的issue lies here 是字符串。

它会在需要时获得casted


您可以做的一件事是通过扩展/覆盖“修复”:

import * as comps from "vuetify/es5/components";

...

const override = comps.VTextField.extend(
  onInput(e) 
    const target = e.target;
    if (this.type !== "number") this.internalValue = target.value;
    else 
      this.internalValue = target.valueAsNumber;
    
    this.badInput = target.validity && target.validity.badInput;
  
);
Vue.component('NewVTextField, override);

$emit(+$event) 的“解决方法”,因为这似乎是intended 路径


但我想你应该使用 setter, getter 方法 - 因为你也可以在 setter 中链接验证器

检查:@roli loli:

computed: 
  computedAddOnStartingPrice: 
    get ()  return this.addOnStartingPrice ,
    set (newVal)  this.$emit('update:addOnStartingPrice', newVal) 
  

【讨论】:

以上是关于v-text-field 在输入后返回字符串,即使它有类型号的主要内容,如果未能解决你的问题,请参考以下文章

如何访问用户在 VueJS 的这些 v-text-fields 中输入的数据?

如何将类名添加到 v-text-fields 标签标签

默认为所有 v-text-field 列出的 Vuetify 集

如何使用json数据填充v-text-field

在默认插槽中动态更改 v-text-field 中的类

在 vuetify v-text-field 道具中使用 HTML