理解之前

翻了翻之前写的一篇笔记computed多值监听,水分很多。最近有一点小收获,决定重新写一篇对computed的理解

关于computed

引用vue官网的一句话"不同的是计算属性是基于它们的依赖进行缓存的。只在相关依赖发生改变时它们才会重新求值。 "

这就意味着只要computed里面的一个函数中的值message没有发生改变,多次访问 这个函数doMessage就会立即返回之前的计算结果,而不必再次执行函数。

demo:

<div id="app">
    <p> | now <p>
</div>

new Vue({
    el:"#app",
    data:{
        message:50
    },
    computed:{
        doMessage:function(){ 
            return this.message * 2
        },
        now(){ // es6的另一种写法
            return Date.now()
        } 
    } 
)}

在上面的demo里面,只要this.message没有发生改变,多次访问 doMessage就会立即返回之前的计算结果,而不必再次执行函数。 而由于Date.now()是一直改变的,所以每当触发重新渲染时,调用方法now()将总会再次执行函数。

使用computed的好处

由于computed的特性,我们可以利用它做一些比较复杂并且耗时的计算,如果不使用计算属性,假设写在一个methods里面,我们点击一下,过去了三秒才把结果计算出来,这对我们的用户来说是及其糟糕的体验。

computed的一些坑

如果我们想通过一个methods方法去直接改变computed计算属性,回报错 demo:

<div id="app">
    <p> | now <p>
    <button @click="count">count</button>
</div>

new Vue({
    el:"#app",
    data:{
        message:50
    },
    computed:{
        doMessage:function(){ 
            return this.message * 2
        },
        now(){ // es6的另一种写法
            return Date.now()
        } 
    },
    methods:{
        count(){
            this.doMessage = 999
        }
    }
)}

请注意我们在html中加了个button。这时候点击button会报错,原因是computed默认只有能获取不能设置(计算属性默认只有 getter ,不过在需要时你也可以提供一个 setter )。如果我们需要进行设置,就需要把computed写成下面这个样子: demo:

new Vue({
    el:"#app",
    data:{
        message:50
    },
    computed:{
        doMessage: {
            get() {
                return this.message * 2
            },
            set(newValue) {
                console.log(newValue)
                this.message = newValue
            }
        },
        now(){ // es6的另一种写法
            return Date.now()
        } 
    },
    methods:{
        count(){
            this.doMessage = 999
        }
    }
)}

当然了,如果通过这个methods方法去改变data里面的值而间接改变computed的值还是可以的。比如: demo:

new Vue({
    el: "#app",
    data: {
        message: 50
    },
    computed: {
        doMessage: function () {
            return this.message * 2
        },
        now() { // es6的另一种写法
            return Date.now()
        }
    },
    methods: {
        count() {
            this.doMessage = 999
        }
    }
})