【问题标题】:Vue.js; Inifinite loop with watch on while loopVue.js;无限循环,在while循环中观察
【发布时间】:2021-02-28 21:52:03
【问题描述】:

我有一个带有数组的 while 循环。然而,这个循环变得无限,因为dealerCards数组没有更新,即使它设置在watch中。如何使用watch 属性更新数组?

<div id="app14">
    <button v-on:click="Stand">Stand</button>
    <p>Dealer: {{dealerCards}}</p>
    <p>Hand: {{dealerHand}}</p>
</div>


<script>
function Draw() {
    return Math.ceil(Math.random() * 13);
}

function CalcHand(cardsArray) {
    cardsArray.forEach(function(c) {
        hand += c;
    });
    return hand;
}


new Vue({
    el: "#app14",
    data: {
        dealerCards: [],
        dealerHand: 0,
    },
    methods: {
        Stand: function() {
            while (this.dealerHand < 17) {
                this.dealerCards.push(Draw());
                console.log("DH: " + this.dealerHand);
            }
        },
    },
    watch: {
        dealerCards: {
            handler: function() {
                this.dealerHand = CalcHand(this.dealerCards);
            },
            deep: true
        },
    }
});

</script>

【问题讨论】:

  • 如果你使用computed而不是watch ?

标签: vue.js while-loop vuejs2 infinite-loop watch


【解决方案1】:

watch 永远不会运行。一般来说,对于同步操作使用计算并观察异步:

new Vue({
    el: "#app14",
    data: {
        dealerCards: [],
    },
    computed: {
        dealerHand() {
            return CalcHand(this.dealerCards);
        }
    },
    methods: {
        Stand: function() {
            while (this.dealerHand < 17) {
                this.dealerCards.push(Draw());
                console.log("DH: " + this.dealerHand);
            }
        },
    }
});

编辑:我忘了提,通过初始化hand 来修复CalcHand 函数。更好的是,将其替换为单行 reducer 并将其移动到计算中:

computed: {
    dealerHand() {
        return this.dealerCards.reduce((a, c) => a + c, 0);
    }
},

演示:

function Draw() {
    return Math.ceil(Math.random() * 13);
}

new Vue({
    el: "#app14",
    data: {
        dealerCards: [],
    },
    computed: {
        dealerHand() {
            return this.dealerCards.reduce((a, c) => a + c, 0);
        }
    },
    methods: {
        Stand: function() {
            while (this.dealerHand < 17) {
                this.dealerCards.push(Draw());
                console.log("DH: " + this.dealerHand);
            }
        },
    }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app14">
    <button v-on:click="Stand">Stand</button>
    <p>Dealer: {{dealerCards}}</p>
    <p>Hand: {{dealerHand}}</p>
</div>

【讨论】:

  • 成功了,非常感谢。实际上,CalcHand 函数更复杂。它不仅仅是计算数组的总和。
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 2014-03-29
  • 2012-12-24
  • 2013-02-22
  • 2011-11-19
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
相关资源
最近更新 更多