VueJS 中的计算道具在输入失去焦点之前不会更新

Computed prop in VueJS not updated until input lost focus

同题。从对象计算的 属性 在输入框失去焦点之前它不会反应。

但是如果对象在数据中,输入中的值一改变就会改变。

我用示例创建了一个代码笔:https://codepen.io/Albvadi/pen/QWwMOQV

<div id="container">
  <div class="row justify-content-center">
    <div class="col-md-8">
      <div class="card">
        <div class="card-header">Match Component</div>

        <div class="card-body">
          <div class="container">
            <div class="row align-items-center">
              <div class="col-4 text-right">{{homeTeam.desc}}</div>
              <div class="col-2">
                <input class="form-control text-center" type="number" min="0" v-model.number="homeTeam.score" />
              </div>
              <div class="col-2">
                <input class="form-control text-center" type="number" min="0" v-model.number="awayTeam.score" />
              </div>
              <div class="col-4">{{ awayTeam.desc }}</div>
              <div class="row">
                <div class="col">
                  DATA:
                  <b>{{ homeTeam.score }}</b>
                </div>
                <div class="row">
                  <div class="col">
                    COMPUTED:
                    <b>{{ awayTeam.score }}</b>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
new Vue({
  el: "#container",
  data: {
    homeTeam: {
      name: "SPA",
      desc: "Spain",
      score: 0
    }
  },
  computed: {
    awayTeam: function() {
      return {
        name: "GER",
        desc: "Germany",
        score: 0
      };
    },
  },
  mounted() {
    console.log("Component mounted.");
  }
});

如果您更改第一个输入,则数据值会立即更改。 如果您更改第二个输入,则计算值仅在输入失去焦点时才更改。

我该如何解决这个问题?

== 编辑 ==

感谢您的回答! 我知道将 awayteam 放在数据部分可以解决问题,这只是一个简化问题的示例。

我的问题是,除了这两个结果,我还想计算 属性 以便能够发布到另一个组件。 我用最终结果编辑了 codepen:https://codepen.io/Albvadi/pen/jOELYwN 并且它工作正常。

但是@Sami Kuhmonen 评论说计算属性只是读取属性但是在我的 checkFinalResult 中我设置了 computedMatch.. 这是正确的方法吗??

在你的情况下,为什么这个计算的 属性 不会立即更新 DOM 元素,因为它没有 dataVue instance.Here 的引用,它 return 只是一些 static 值,这不是 computed 属性 的目的。 computed property 达到目的,当您需要根据 data propertyvue 实例计算或计算某些决定时。

new Vue({
  el: "#container",
  data: {
    homeTeam: {
      name: "SPA",
      desc: "Spain",
      score: 0
    },
    awayTeam: {
      name: "GER",
      desc: "Spain",
      score: 0
    },
  },
  mounted() {
    console.log("Component mounted.");
  }
});
<div id="container">
  <div class="row justify-content-center">
    <div class="col-md-8">
      <div class="card">
        <div class="card-header">Match Component</div>

        <div class="card-body">
          <div class="container">
            <div class="row align-items-center">
              <div class="col-4 text-right">{{homeTeam.desc}}</div>
              <div class="col-2">
                <input class="form-control text-center" type="number" min="0" v-model.number="homeTeam.score" />
              </div>
              <div class="col-2">
                <input class="form-control text-center" type="number" min="0" v-model.number="awayTeam.score" />
              </div>
              <div class="col-4">{{ awayTeam.desc }}</div>
              <div class="row">
                <div class="col">
                  DATA:
                  <b>{{ homeTeam.score }}</b>
                </div>
                <div class="row">
                  <div class="col">
                    COMPUTED:
                    <b>{{ awayTeam.score }}</b>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

为什么要为这个任务使用计算 属性?我会简单地这样做。

  new Vue({
     el: "#container",
     data: {
        homeTeam: {
        name: "SPA",
       desc: "Spain",
       score: 0
     },
    awayTeam:  {
       name: "GER",
       desc: "Germany",
       score: 0
     },
   },
   mounted() {
      console.log("Component mounted.");
   }
 });

计算属性应被视为只读。每次它们引用的属性发生变化时,它们的值都是根据其他值计算的,并且所有更改都将丢失(或者至少应该这样认为,在某些情况下可能会保留一些值)。尽管有时更改它们的属性似乎有效,但这并不能保证它们可能会随时更改。

在 codepen 中,您已经计算出 属性 从对象中引用其他属性,因此您必须添加所有您想要类似更改的内容,然后更改该值。这将导致重新评估计算值,并且更改将可见并持久化。

请注意,从许多单独的事物构建计算对象可能不是最高效的方法,这取决于应如何处理它的情况。如果这些值仅在组件内使用,那么直接使用它们很容易,但如果您需要一个特定形式的对象并需要它响应,那么计算 属性 可能是可行的方法。