Vue关于computed计算属性?

Vue为什么console了一次 computed,三次 methods?
代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./vue.js">

    </script>
</head>

<body>
    <div id="app">
        <span>
            {{computedMessage}}
            {{computedMessage}}
            {{computedMessage}}
        </span>
        <span>
            {{calcMessage()}}
            {{calcMessage()}}
            {{calcMessage()}}
        </span>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                message: 'hi'
            },
            computed: {
                computedMessage() {
                    console.log('computed')
                    return 'computed ' + this.message
                },
            },
            methods: {
                calcMessage() {
                    console.log('methods')
                    return 'calc ' + this.message
                }
            }
        })
    </script>
</body>

</html>
阅读 3.8k
4 个回答

官方解释 https://cn.vuejs.org/v2/guide...

// 在组件中
methods: {
  reversedMessage: function () {
    return this.message.split('').reverse().join('')
  }
}

我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的依赖进行缓存的。只在相关依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。

计算属性computed是基于它的依赖计算的,即上述计算属性的方法computedMessage()依赖的message一直没变,所以computedMessage()就只有初始运行的一次,所以只输出一次,加粗message没变之前以后每次访问computedMessage都是之前的缓存的结果,而methods中的方法calcMessage,你在代码中直接调用了三次,所以输出了三次

虽然楼上说的内容都没错,但这里的原因只是因为computedMessage只发生了一次求值,就是在computed初始化后由模板触发了一次get操作。

计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。注意,如果某个依赖 (比如非响应式属性) 在该实例范畴之外,则计算属性是不会被更新的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题