I am poor and inexperienced.

Vue

【VUE】07:Vue 计算属性


avatar
Lucky 2022-09-29 545

1、Vue的计算属性是什么?

首先我们先了解一下什么是模板内表达式?

例子:

可见,我在View层的模板里写了一个表达式(三元表达式)

显而易见,这就是模板内表达式。

然而,这跟计算属性有什么关系呢?

因为模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。【如上图,就会显得很臃肿】

 

因此,Vue推荐使用计算属性来描述依赖响应式状态的复杂逻辑。

 

2、计算属性

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学习Vue的计算属性</title>
</head>
<body>
<!--view层,模板-->
<div id="app">
    <div>{{optimize}}</div>
</div>
<!--1.导入Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
    var vm = new Vue({
        el:"#app",
        //data:属性:vm
        data(){
            return{
                program: {
                    name: '各种编程语言',
                    language:['Vue','Java','Python','PHP']
                }
            }
        },
        computed:{
            optimize(){
                return this.program.language.length>0?'Yes' : 'No'
            }
        }
    });
</script>
</body>
</html>

 

 

说明:

我在这里定义了optimize计算属性,里面的this.program绑定了data()里面的数据,是依赖着data(),当数据发生改变optimize里面的内容也会重新计算相应更新。

 

3、计算属性与方法

  • 计算属性方法名重名时候,只会调用methods的方法。

 

  • 计算属性缓存方法。

计算属性是有缓存的,而方法是没有的。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学习Vue的计算属性</title>
</head>
<body>
<!--view层,模板-->
<div id="app">
    <div>{{optimize1()}}</div>
    <div>{{optimize2}}</div>
</div>
<!--1.导入Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
    var vm = new Vue({
        el:"#app",
        data(){
            return{
                message:'测试'
            }
        },
        methods:{
            optimize1:function (){
                return Date.now()
            }
        },
        computed:{
            optimize2(){
                this.message;
                return Date.now()
            }
        }
    });
</script>
</body>
</html>

 

 

说明:

注意:methods和computed里的东西不能重名,重名之后,只会调用methods的方法

methods:定义方法, 调用方法使用optimize1(), 需要带括号

computed:定义计算属性, 调用属性使用optimize2, 不需要带括号:this.message是为了能够让optimize2观察到数据变化而变化

如何在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用vm.message=”新消息”, 改变下数据的值,再次测试观察效果!

总结:

若我们将同样的函数定义为一个方法而不是计算属性,两种方式在结果上确实是完全相同的,然而,不同之处在于计算属性值会基于其响应式依赖被缓存。一个计算属性仅会在其响应式依赖更新时才重新计算。

相比之下,方法调用总是会在重渲染发生时再次执行函数。

为什么需要缓存呢?想象一下我们有一个非常耗性能的计算属性 list,需要循环一个巨大的数组并做许多计算逻辑,并且可能也有其他计算属性依赖于 list。没有缓存的话,我们会重复执行非常多次 list 的计算函数,然而这实际上没有必要!如果你确定不需要缓存,那么也可以使用方法调用。