【发布时间】:2020-04-18 03:39:12
【问题描述】:
和标题一样。对象的计算属性在输入框失去焦点之前不会反应。
但如果对象在数据中,则值在输入中更改后立即更改。
我用示例创建了一个代码笔: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.");
}
});
如果您更改第一个输入,则数据值会立即更改。 如果更改第二个输入,则计算值仅在输入失去焦点时才更改。
我该如何解决这个问题?
== 编辑 ==
感谢您的回答! 我知道将team放在数据部分可以解决问题,这只是简化我的问题的一个例子。
我的问题是,除了这两个结果之外,我还希望有一个计算属性能够发布到另一个组件。 我用最终结果编辑了 codepen:https://codepen.io/Albvadi/pen/jOELYwN,它工作正常。
但是@Sami Kuhmonen cmets 计算的属性只是读取属性,但在我的checkFinalResult 中,我正在设置computedMatch..
这是正确的方法吗??
【问题讨论】:
-
不应更改计算值。它们是根据其他数据计算的,因此是只读的。
-
谢谢!你能检查我的编辑吗?
-
你永远不会在计算属性中设置任何东西。这是正确的做法。所以你仍然在做错事。如果您确实需要修改计算数据,那么其中的每个字段都引用
data中的字段,然后您可以根据需要进行修改。就像你已经对其中一些做的那样。 -
再次感谢您。如果您愿意,请将您的评论作为答案发布,我会检查它是否为正确答案。我认为这是对我的问题最有帮助的评论...我会尝试重构我的数据以不在计算属性中设置任何内容...再次感谢!
标签: javascript vuejs2 computed-properties vue-reactivity