gpt4 book ai didi

javascript - VUE watch触发死循环

转载 作者:行者123 更新时间:2023-11-29 17:46:27 25 4
gpt4 key购买 nike

我刚开始使用 VUE.Js,我创建了一个非常简单的应用程序来试用它的工作原理。

当我运行应用程序时,问题立即发生,变量的监视在无限循环中被触发。我不知道为什么。有一个 v-for 循环,但它位于只有两个元素的数组上。

最初小计应为 0。但是一旦应用程序运行,它就会触发 Buy 方法,即使我没有单击购买按钮并且小计最终为 442.37999999999965。

感谢您的帮助。

这是 jsfiddle Beer shopping cart

HTML :

<div id = "growler">      
<table>
<tr>
<th style='width:150px'>Beer</th>
<th style='width:50px'>Price</th>
<th style='width:30px'></th>
</tr>

<tr v-for = "beer in beers">
<td>{{ beer.name }}</td>
<td>{{ beer.price }}</td>
<td>
<button :click="buy(beer)">buy</button>
</td>
</tr>

<tr>
<td>SubTotal</td>
<td>{{subTotal}}</td>
<td></td>
</tr>
</table>
</div>

JS:

  new Vue({
el: "#growler",
data: {
beers: [
{name: 'Ahool Ale', price: 2.00},
{name: 'Agogwe Ale', price: 2.38}
],
shoppingCart: [],
subTotal: 0.00
},
watch: {
shoppingCart: function() {
console.log('shopping cart watch triggered');
this.updateSubTotal();
}
},
methods: {
updateSubTotal: function () {
var s=this.shoppingCart.length;
var t=0;
for (var i=0;i<s; i++){
t += this.shoppingCart[i].price;
}
this.subTotal = t;
},
buy: function (beer) {
console.log('beer pushed on array');
this.shoppingCart.push(beer);
}
},
beforeCreate: function() {
console.log('beforeCreate');
},
created: function() {
console.log('created');
},
beforeMount: function() {
console.log('beforeMount');
},
mounted: function() {
console.log('mounted');
},
beforeUpdate: function() {
console.log('beforeUpdate');
},
updated: function() {
console.log('updated');
},
beforeDestroy: function() {
console.log('beforeDestroy');
},
destroyed: function() {
console.log('afterDestroy');
}

});

最佳答案

我发现了你的错误:

<button :click="buy(beer)">buy</button>  

您使用了 :(v-bind) 而不是点击处理程序。

当您第一次绑定(bind)它时,该函数被调用一次并更新 shoppingCart。这将更新 subTotal 数据,这将强制重新呈现 DOM,这将再次触发 buy 函数,因为 :bind.

修复:

<button @click="buy(beer)">buy</button>  
<!-- or -->
<button v-on:click="buy(beer)">buy</button>

建议的代码更改:

使用计算属性而不是方法来更新表示其他值之和的属性:

new Vue({
el: "#growler",
data: {
beers: [{
name: 'Ahool Ale',
price: 2.00
},
{
name: 'Agogwe Ale',
price: 2.38
}
],
shoppingCart: []
},
watch: {
shoppingCart: function() {
console.log('shopping cart watch triggered');
}
},
computed: {
subTotal: function() {
return this.shoppingCart.reduce(function(total, beer) {
return total + beer.price;
}, 0);
}
}
},
methods: {
buy: function(beer) {
this.shoppingCart.push(beer);
}
},

});
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
<div id="growler">
<button>buy</button>
<table>
<tr>
<th style='width:150px'>Beer</th>
<th style='width:50px'>Price</th>
<th style='width:30px'></th>
</tr>

<tr v-for="beer in beers">
<td>{{ beer.name }}</td>
<td>{{ beer.price }}</td>
<td>
<button @click="buy(beer)">buy</button>
</td>
</tr>

<tr>
<td>SubTotal</td>
<td>{{subTotal}}</td>
<td></td>
</tr>
</table>
</div>

关于javascript - VUE watch触发死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49015152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com