18、计算属性缓存-methods方法同样起到计算属性的作用

95 阅读1分钟

调用methods 里的力法也可以与计算属性起到同样的作用,比如下面示例可以用methods 改写为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>18、计算属性缓存-methods方法同样起到计算属性的作用</title>
</head>
<body>
    <div id="app">
        <!-- 注意,这里的reversedText是方法,所以要带() -->
        {{reversedText()}}
    </div>

    <script src="./vue.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data:{
                text:'123,456'
            },
            methods:{
                reversedText:function(){
                    return this.text.split(',').reverse().join(',');
                }
            }
        })
    </script>
</body>
</html>

输出:456,123

下面代码是计算属性:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>13、计算属性</title>
</head>
<body>
    <div id="app">
        <!-- //{{text.split(',').reverse().join(',')}} -->
        {{reverseText}}
    </div>

    <script src="./vue.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data:{
                text:'123,456'
            },
            computed: {
                reverseText:function() {
                    return this.text.split(',').reverse().join(',')
                }
            },
        })
        // 输出:456,123
    </script>
</body>
</html>

输出:456,123

没有使用计算属性,在methods里定义了一个方法实现了相同的效果,甚至该方法还可以接受参数,使用起来更灵活。既然使用methods就可以实现,那么为什么还需要计算属性呢?(原因就是计算属性是基于它的依赖缓存的。一个计算属性所依赖的数据发生变化时,它才会重新取值,所以text只要不改变,计算属性也就不更新,例如:

computed:{
    now:function(){
        return Data.now();
    }
}

这里的Date.now()不是响应式依赖,所以计算属性now不会更新。但是methods则不同,只要重新渲染,它就会被调用,因此函数也会被执行。 使用计算属性还是methods取决于你是否需要缓存,当遍历大数组和做大量计算时,应当使用计算属性,除非你不希望得到缓存。