【问题标题】:Vue computed properties, issues with addition vs concatenationVue 计算属性,加法与连接的问题
【发布时间】:2020-10-08 16:26:37
【问题描述】:

刚刚学习 Vue,偶然发现了一个有趣的行为,我想知道为什么会发生这种情况以及如何避免它。

<template>
  <div>
    <input type="number" v-model="a" style="color: white" />
    <input type="number" v-model="b" style="color: white" />
    <p style="color: white">{{ c }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      a: 1,
      b: 2
    };
  },
  computed: {
    c: function() {
      return this.a + this.b;
    }
  }
};
</script>

在第一次渲染时,“c”显示为“3”,这是我所期望的。但是,如果我更改其中一个输入,则这两个数字将连接在一起。例如,如果我将“a”更改为“11”,我的预期值为 13,但我得到的是“112”。为什么会这样?

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component computed-properties


    【解决方案1】:

    只需使用Number 对象构造函数来求和:

      computed: {
        c: function() {
          return Number(this.a) + Number(this.b);
        }
      }
    

    这两个操作数被视为字符串,当您尝试将+ 放在它们之间时,它们将被连接起来,为了避免这种默认行为,请尝试使用Number 构造函数或parseIntparseFloat 函数来更改求和操作的行为。

    或尝试在v-model 指令中使用number 修饰符,例如:

    <input type="number" v-model.number="b" style="color: white" />
    

    【讨论】:

    • 那行得通。我不完全理解为什么它是必要的。当我通过文档工作时,它可能会变得更加清晰。编辑 - 真正让我困惑的是为什么它首先呈现 3 而不是 12,然后在输入时切换到串联......
    • 我认为 number 修饰符是最好的解决方案,因为我们正在使用 vue
    • 这是有道理的。你知道为什么 Vue 最初计算的是“3”而不是“12”吗?也许没关系,因为您提供了一些解决方法,但我目前没有特定的用例,我只是在尝试学习框架。
    • 数据最初声明并转换为数字1,但是当您键入数据时,数据将更新为字符串'1'
    • 是的!刚刚在文档中找到它... "v-model 将忽略在任何表单元素上找到的初始值、检查或选定属性。它总是将 Vue 实例数据视为事实来源。你应该声明JavaScript 端的初始值,在组件的 data 选项内。” 因此...初始数据是一个数字,输入字段被解释为字符串,即使它设置为 type= “数字”。 Vue 显然不考虑这一点,因此您的 v-model.number 将是解决此问题的最正确方法。感觉很好学习新东西哈哈。
    猜你喜欢
    • 2019-05-05
    • 2020-02-03
    • 2019-12-16
    • 2021-07-11
    • 2020-12-01
    • 1970-01-01
    • 2021-05-04
    • 2022-11-11
    • 2018-01-14
    相关资源
    最近更新 更多