ChatGPT解决这个技术问题 Extra ChatGPT

Vue 中的方法与计算

Vue.js 中的 methodscomputed 值之间的主要区别是什么?

它们看起来相同且可互换。

@xDreamCoding 您链接的答案恰好解决了这个问题,但这个问题绝不是重复的。再加上它更出名。
请参阅在计算属性与方法标题下对该主题有所了解的文档:vuejs.org/v2/guide/computed.html

t
tony19

Vue 中的计算值和方法非常不同,并且在大多数情况下绝对不能互换。

计算属性

计算值更合适的名称是 computed property。事实上,当 Vue 被实例化时,计算属性会被转换为 Vue 的属性,其中包含一个 getter,有时还有一个 setter。基本上,您可以将计算值视为派生值,只要用于计算它的基础值之一被更新,它就会自动更新。您不调用计算并且它不接受任何参数。就像引用数据属性一样引用计算属性。以下是 documentation 中的经典示例:

computed: {
  // a computed getter
  reversedMessage: function () {
    // `this` points to the vm instance
    return this.message.split('').reverse().join('')
  }
}

在 DOM 中引用如下:

<p>Computed reversed message: "{{ reversedMessage }}"</p>

计算值对于处理 Vue 中存在的数据非常有价值。每当您想要过滤或转换数据时,通常都会为此目的使用计算值。

data:{
    names: ["Bob", "Billy", "Mary", "Jane"]
},
computed:{
    startsWithB(){
        return this.names.filter(n => n.startsWith("B"))
    }
}

<p v-for="name in startsWithB">{{name}}</p>

计算的值也被缓存以避免重复计算一个在没有更改时不需要重新计算的值(例如,它可能不在循环中)。

方法

方法只是绑定到 Vue 实例的函数。只有当您明确调用它时才会对其进行评估。像所有 javascript 函数一样,它接受参数并且每次调用时都会重新计算。方法在相同的情况下很有用,任何函数都很有用。

data:{
    names: ["Bob", "Billy", "Mary", "Jane"]
},
computed:{
    startsWithB(){
        return this.startsWithChar("B")
    },
    startsWithM(){
        return this.startsWithChar("M")
    }
},
methods:{
    startsWithChar(whichChar){
        return this.names.filter(n => n.startsWith(whichChar))
    }
}

Vue 的 documentation 非常好并且易于访问。我推荐它。


如果用户有两个输入,例如从 c 到 f 的温度转换,反之亦然,其中两个输入都可以确定彼此的值。请参阅 albireo.ch/temperatureconverter 并且两个输入会自动做出反应,而无需按下转换按钮。哪一个最适合使用计算或方法?
对于具有输入之间循环关系的 特定 UI,我将使用方法。 codepen.io/Kradek/pen/gROQeB?editors=1010
@Bootstrap4虽然,这里也有一个计算的,但它更复杂。 codepen.io/Kradek/pen/gROQeB?editors=1010
>方法 ... 只会在您明确调用它时进行评估。不是根据这个视频:youtube.com/watch?v=O14qJr5sKXo
@CameronHudson 在视频中的示例中,对方法进行了评估,因为它们在 模板 中被明确引用。这是an example that demonstrates the difference。请注意,方法仅在数据更改时调用,如果它们在模板中被显式引用。
C
Community

正如@gleenk 要求提供一个实际示例来说明方法和计算属性之间的缓存和依赖关系差异,我将展示一个简单的场景:

应用程序.js

new Vue({
    el: '#vue-app',
    data: {
        a: 0,
        b: 0,
        age: 20
    },
    methods: {
        addToAmethod: function(){
            console.log('addToAmethod');
            return this.a + this.age;
        },
        addToBmethod: function(){
            console.log('addToBmethod');
            return this.b + this.age;
        }
    },
    computed: {
        addToAcomputed: function(){
            console.log('addToAcomputed');
            return this.a + this.age;
        },
        addToBcomputed: function(){
            console.log('addToBcomputed');
            return this.b + this.age;
        }
    }
});

在这里,我们有 2 个方法和 2 个计算属性来执行相同的任务。方法addToAmethod & addToBmethod 和计算的属性 addToAcomputed & addToBcomputed 都将 +20(即 age 值)添加到 ab。关于这些方法,它们每次对列出的属性中的任何执行操作时被调用,即使某个特定属性的依赖项方法没有改变。对于计算属性,仅当依赖项发生更改时才执行代码;例如,引用 A 或 B 的特定属性值之一将分别触发 addToAcomputedaddToBcomputed

方法和计算描述看起来非常相似,但正如 @Abdullah Khan 已经specified它们不是一回事!现在让我们尝试添加一些 html 来一起执行所有内容,看看有什么不同。

方法案例演示

new Vue({ el: '#vue-app', data: { a: 0, b: 0, age: 20 }, methods: { addToAmethod: function(){ console.log('addToAmethod'); return this。 a + this.age; }, addToBmethod: function(){ console.log('addToBmethod'); return this.b + this.age; } } }); VueJS 方法 - stackoverflow

方法

年龄 + A = {{ addToAmethod() }}

年龄 + B = {{ addToBmethod() }}

解释结果

当我点击按钮“添加到A”时,所有方法都被调用(见上面的控制台日志屏幕结果),addToBmethod()也被执行但我没有按“添加到 B” 按钮;引用 B 的属性值没有改变。如果我们决定单击按钮“添加到 B”,也会出现相同的行为,因为这两个方法都将独立于依赖项更改而被调用。根据这种情况,这是不好的做法,因为我们每次都在执行方法,即使依赖项没有改变。这真的很消耗资源,因为没有缓存未更改的属性值。

https://i.stack.imgur.com/Fa8GT.png

计算属性案例演示

new Vue({ el: '#vue-app', data: { a: 0, b: 0, age: 20 }, computed: { addToAcomputed: function(){ console.log('addToAcomputed'); return this。 a + this.age; }, addToBcomputed: function(){ console.log('addToBcomputed'); return this.b + this.age; } } }); VueJS 计算属性 - stackoverflow <脚本 src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.11/vue.min.js">

计算属性

< p>Age + A = {{ addToAcomputed }}

Age + B = {{ addToBcomputed }}


c
chase

以下是 Vue3 documentation 的内容 - 查看示例:

对于最终结果,这两种方法确实完全相同。但是,不同之处在于,计算属性是根据它们的反应依赖来缓存的。计算属性仅在其某些反应性依赖项发生更改时才会重新评估。 [...] 相比之下,只要发生重新渲染,方法调用将始终运行该函数。

附加链接

方法计算属性


m
mohammad

计算和方法之间的区别在于,当你在计算中定义一个函数时,只有当答案发生变化时它才会从头执行函数,但方法每次调用时都会从头执行函数。