Vue 将 input[type=number] 转换为字符串值

IT技术 javascript vue.js
2021-03-18 02:15:18

我遇到了这个问题,Vue 将类型为 number 的输入字段的值转换为字符串,但我不知道为什么。我正在遵循的指南没有遇到这个问题,并且按预期将值作为数字获取。

vue 文档指出,如果输入的类型是数字,则 Vue 会将值转换为数字。

代码源自一个组件,但我将其调整为在 JSFiddle 中运行:https ://jsfiddle.net/d5wLsnvp/3/

<template>
    <div class="col-sm-6 col-md-4">
        <div class="panel panel-success">
            <div class="panel-heading">
                <h3 class="panel-title">
                    {{ stock.name }}
                    <small>(Price: {{ stock.price }})</small>
                </h3>
            </div>
            <div class="panel-body">
                <div class="pull-left">
                    <input type="number" class="form-control" placeholder="Quantity" v-model="quantity"/>
                </div>
                <div class="pull-right">
                    <button class="btn btn-success" @click="buyStock">Buy</button>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        props: ['stock'],
        data() {
            return {
                quantity: 0 // Init with 0 stays a number
            };
        },
        methods: {
            buyStock() {
                const order = {
                    stockId: this.stock.id,
                    stockPrice: this.stock.price,
                    quantity: this.quantity
                };
                console.log(order);
                this.quantity = 0; // Reset to 0 is a number
            }
        }
    }
</script>

数量value是问题。它初始化为 0,当我按下“购买”按钮时,控制台显示:

Object { stockId: 1, stockPrice: 110, quantity: 0 }

但是,只要我通过使用微调器或仅输入新值来更改值,控制台就会显示:

Object { stockId: 1, stockPrice: 110, quantity: "1" }

使用 Firefox 59.0.2 和 Chrome 65.0.3325.181 进行测试。两者都表示它们是最新的。我实际上也在 Microsoft Edge 中尝试过,结果相同。

那么我在这里错过了什么?为什么 Vue 不将值转换为数字?

2个回答

您需要使用.number修饰符 forv-model,如下所示:

<input v-model.number="quantity" type="number">

注意:空字符串 ( '') 不会转换为数字,因此您可能需要单独处理。

我不知道它是否以及何时起作用。可能是 Vue 1.0 的工作方式不同。并且不要太担心不成功的谷歌搜索,它发生在每个人身上。我添加了更多评论以供参考,因此您可以查看此处使用的短语。
2021-04-27 02:15:18
有没有办法在不使用 v-model 的情况下实现这一点?即在使用 vuex 时?
2021-04-28 02:15:18
作为说明,我通过简单地谷歌搜索 [vue v-model number input] 找到了它。这是最高的结果。
2021-04-29 02:15:18
很好的答案!我在互联网上找到的唯一一个,有效!:) 谢谢+1
2021-05-02 02:15:18
嗯,嗯,是的,它有效,我现在觉得有点傻......我的搜索在 github 和 co 上返回了几个线程,但没有任何解决方案,但该链接不在其中......而且似乎我使用的指南已经过时了...无论如何,感谢您的帮助
2021-05-19 02:15:18

将订单对象更改为:

const order = {
    stockId: this.stock.id,
    stockPrice: this.stock.price,
    quantity: +this.quantity
};

这将自动将字符串解析为数字。

通常,来自 HTML 输入的数据是字符串。输入类型仅检查字段中是否提供了有效字符串。