vue.js v-text-field在键入后返回字符串,即使它具有类型号

lsmepo6l  于 2023-05-18  发布在  Vue.js
关注(0)|答案(6)|浏览(259)
<VTextField
                :value="addOnStartingPrice"
                solo
                outline
                reverse
                append-icon="attach_money"
                type="number"
                min="0"
                step="any"
                @input="$emit('update:addOnStartingPrice', $event)"
              />

我有这样的东西。
问题1)只要我改变了数字或类型,它就会正确地抛出数字值,但是它的类型是String而不是number,所以类型检查失败。如何让它返回类型:number的值?
问题2:step="any" and min="0"到底做什么?我猜它们不起作用,因为我也可以输入负数。

e1xvtsh3

e1xvtsh31#

事实上,vuetify返回字符串。作为一种解决方法,您可以使用数字修改器。

<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属性,请读取Html input min
您还可以使用vuetify规则来检查用户是否输入了正数。示例:

<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

vc9ivgsu

vc9ivgsu2#

问题就出在这里,因为InputElements的value属性是string。

需要的时候就可以铸造
你可以做的一件事是通过extend/override来“修复”:

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)的“变通方法”,因为这似乎是预期的路径
但是我想您应该使用setter,getter aproach -因为您也可以在setter中链接验证器。
check:@roli loli:

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

plicqrtu3#

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

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

bjp0bcyl4#

<input v-model.number="price" type="number">
data() {
    return {
      price: '',
    }
  },

将保存整数

1u4esq0p

1u4esq0p5#

我可以使用v-on:change事件来转换我的输入。我无法让Andrew Vasilchuk's answer工作。

<v-text-field
    v-model="item.quantity"
    label="Quantity"
    type="number"
    v-on:change="item.quantity = parseFloat(item.quantity)"
></v-text-field>
jm2pwxwz

jm2pwxwz6#

在模型中使用Number()构造函数,它应该可以正常工作。

<script setup>
import { ref } from 'vue'

const mymodel = ref(0)

function apiCall() {
  const req = {
     size: Number(mymodel.value)
     // rest of request...
  }

  // rest of code...
}

</script>

<template>
  <v-text-field type="number" v-model="mymodel"/>
</template>

相关问题