javascript - Vue 在 :click Seems to Call All Methods 上

标签 javascript vue.js vuejs2

我目前正在学习 Vue,我遇到了一个问题,希望有人能帮助我解决。

当使用 v-on:click 指令调用方法时,如果该方法也在别处使用,则将调用所有其他实例方法。

HTML:

<div id="exercise">
    <div><button class="test" v-on:click="newCheck()">New Challenge</button>
        <p >Success check is: {{ passCheck }}</p>
    </div>
    <div>
        <button class="roll" v-on:click="roll20()">Roll!</button>
        <p>You Rolled a {{ roll20() }}</p>
    </div>
</div>

JS:

new Vue({
    el: '#exercise',
    data: {
        yourRoll: '10',
        passCheck: '10',    
    },
    methods: {
        roll20: function(){
            this.yourRoll = Math.round(Math.random()*19)+1;
            return this.yourRoll;
        },
        newCheck: function(){
            this.passCheck = Math.round(Math.random()*19)+1;
        }
    }
});

当在第二段中使用 {{ roll20() }} 时,单击“新挑战”按钮会同时运行 roll20() 和 newCheck()。但是,如果在第二段中使用 {{ yourRoll }},则不会发生这种情况。

在这两种情况下,点击“滚动!”只运行 roll20()。

谁能帮忙解释一下这里发生了什么?

这是问题的代码笔: Codepen of code

注意:我最终通过使用不同的方法绕过了这个问题,但我仍然想知道为什么会这样:Working Approach

最佳答案

每当 DOM 更新时,它将再次运行roll20,因为行:

<p>You Rolled a {{ roll20() }}</p>

因此任何触发更新的东西都会因此触发 roll20


现在,因为模板:

<div><button class="test" v-on:click="newCheck()">New Challenge</button>

我们知道,当您点击 New Challenge 时,它会调用 newCheck 方法。


并且由于 newCheck 方法更改了模板中使用的变量 (passCheck):

    newCheck: function(){
        this.passCheck = Math.round(Math.random()*19)+1;
    }

这里用的是:

    <p>Success check is: {{ passCheck }}</p>

更改 passCheck 将触发 DOM 更新。并且 DOM 更新将自动调用 roll20(由于本答案第一段所述的原因)。


解决方法:

最简单的方法就是不在模板中调用 roll20。而且,由于 roll20 实际上更新了 yourRoll 属性:

    roll20: function(){
        this.yourRoll = Math.round(Math.random()*19)+1;
        return this.yourRoll;
    },

您可以只在模板中使用 yourRoll,而不是 roll20():

<p>You Rolled a {{ yourRoll }}</p>

代码笔:https://codepen.io/acdcjunior/pen/PePBeo

关于javascript - Vue 在 :click Seems to Call All Methods 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49969345/

相关文章:

javascript - 在 HTML Canvas 上绘制多条路径

javascript - 我可以将此函数传递给 JavaScript 中的另一个函数吗?

javascript - 如何根据键匹配值将两个对象数组合并为一个数组

javascript - 如何将日期点击添加到 Vuetify 日历

vue.js - 我该如何解决 "Interpolation inside attributes has been removed. Use v-bind or the colon shorthand"? Vue.js 2

vue.js - 无法使用Typescript在vuejs中导入多个组件

javascript - jquery动画编号从到

node.js - 寻找一种通过 IP 地址(包括 SSL 证书)创建 HTTPS REST api 连接的方法

vue.js - 从 VueJS2 轻松迁移到 VueJS3 的最佳实践?

node.js - 在 vuejs 2 组件中导入 css/js 文件时出现问题