vue的computed的疑惑

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <title>Computed</title>

    </head>

    <body>
        <div id="app">
            <label for="">FirstName:<input v-model="firstName"/></label><br>
            <label for="">LastName:<input v-model="lastName"/></label><br>
            <label for="">NickName<input v-model="nickName"/></label><br>
            <p>名称:{{name}}</p>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue"></script>
        <script>
            new Vue({
                el: '#app',
                data: function() {
                    return {
                        firstName: '',
                        lastName: '',
                        nickName: ''
                    }
                },
                computed: {
                    name: function() {
                        console.log('触发computed了')
                        if (this.nickName) {
                            return this.nickName
                        } else {
                            return this.firstName + '.' + this.lastName
                        }
                    }
                }
            })
        </script>
    </body>
</html>

以上代码当nickName有值后,再更改firstNamelastName将不再触发computed,是不是可以理解成computed的依赖收集在return this.nickname时发生了变化

阅读 2.1k
4 个回答

首先依赖收集是获取组件中data数据时候发生的。上面的例子中computedname进行收集依赖的过程是按照程序的执行逻辑。
当你的nickName''的时候,初始化就把组件中nickName, firstName, lastName都访问到了。你可以理解为这些依赖都采集到了,当它们发生变化后,会触发name这个方法。

当你的nickName有值后, 初始化中只访问了nickNamefirstName, lastName没有被访问。可以理解为没有收集到它们的依赖,所以它们发生变化,不会触发name这个方法。可你也要注意,在这种情况下,当nickName''时,程序会访问到firstName, lastName。这里会重新收集它们的依赖。

当nickName有值后,再更改firstName或lastName将不再 return this.firstName + '.' + this.lastName

通俗来讲,是因为vue很聪明,他知道你结果不变,不用再算一遍
具体原理可以去看源码

这个理解就不对了,看看你计算属性里的if..else..判断,当已有了this.nickname后,计算属性根本就没有动态计算,更何谈响应式更新,要知道computed属性是依赖式响应式更新的。

为何不将代码改成:

computed: {
    name: function() {
        console.log('触发computed了')
        return this.firstName + '.' + this.lastName
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题