初识Vue.js(三)

3.1 什么是计算属性

在上一篇博文中,我们已经可以搭建出一个简单的Vue应用,在模板中双向绑定一些数据或表达式了。但是表达式如果过长,或逻辑更为复杂时,就会变得臃肿甚至难以维护,比如:

    <div>
            {{text.split(',')}}.reverse().join(',')

        </div>

这里的表达式分为三个操作,并不是很清晰,所以在遇到复杂的逻辑时应该使用计算属性。上例可以用计算属性进行改写:

body>
        <div id='app'>
            {{reversedText}}

        </div>
        <script src="img/js/vue.js"></script>
        <script>

            var app=new Vue({
                el:'#app',
                data:{
                    text:'123,456'
                },
                computed:{
                    reversedText:function(){
                        //这里的this指向的是当前Vue实例
                        return this.text.split(',').reverse().join(',');
                    }
                }   
            });
        </script>
    </body>

所有的计算属性都以函数的形式写在Vue实例内的Computed选项内,最终返回计算后的结果。

3.2 计算属性用法

在一个计算属性里可以完成各种复杂的逻辑,包括运算,函数调用等,只要最终返回一个结果就可以。除了上例简单的用法,计算属性还可以依赖多个Vue实例的数据,只要其中任意数据变化,计算属性就会重新执行,视图也会更新,下面的事例是购物车两个包裹的物品总价:

<body>
        <div id="app">
        总价:{{prices}}
        </div>
        <script src="img/js/vue.js"></script>
        <script>

            var app=new Vue({
                el:'#app',
                data:{
                    package1: [
                    {
                        name :'iphonex',
                        price:7199,
                        count:2

                    },
                    {
                        name :'Ml6',
                        price:1999,
                        count:1

                    }
                    ],
                    package2:[
                    {
                        name :'mate10',
                        price:3199,
                        count:4

                    },
                    {
                        name :'MX7',
                        price:2199,
                        count:5

                    }

                    ]
                },
                computed: {
                prices:function() {
                    var prices=0;
                    for(var i=0;i<this.package1.length;i++){
                        prices += this.package1[i].price*this.package1[i].count;

                    }
                    for(var i=0,i<this.package2.length;i++){

                        prices += this.package2[i].price()*this.package2[i].count;
                    }

                    return prices;
                }

                }

            });
        </script>
    </body>

每一个计算属性都包含一个getter和setter,上面的例子只是利用了getter来读取,当手动修改计算属性的值就像修改一个普通数据那样时,就会触发setter函数,执行一些自定义操作,例如:

<body>
        <div id="app">
        姓名:{{fullName}}
        </div>
          <script src="img/js/vue.js"></script>  
        <script>

            var app=new Vue({
                el:'#app',
                data:{
                    firstName:'许',
                    lastName:'晨'
                },
                computed: {
                    fullName:{
                        //getter用于接收
                        get:function(){

                            return this.firstName +' '+this.lastName;
                        },
                        set:function(newValue){
                            var names=newValue.split(' ');
                            this.firstName=names[0];
                            this.lastName=names[names.length-1];
                        }

                    }

                }



            });
        </script>
    </body>

当执行app.fullName=’许 晨’时,setter就会被调用,数据firstName和lastName都会被更新,视图同样也会被更新,绝大多数情况下,我们只会用默认的getter方法来读取一个计算属性,在业务中很少用到Settter,所以在声明一个计算属性的时候,可以直接使用默认的写法,不必将getter和setter都声明,计算属性除了上例简单的文本插值外,还经常用于动态设置元素的样式名称class和内联样式style,当使用组件时,计算属性也常来用来传递props。
计算属性有两个很实用的小技巧。一是计算属性可以依赖其他计算属性,二是计算属性不仅可以依赖当前Vue实例的数据,还可以依赖其他实例的数据。

我们写的组件所用到的数据需要依赖别人的组件提供。

3.3 计算属性缓存

计算属性是基于它的依赖缓存的,一个计算属性所依赖的数据发生变化时,它才会重新取值。使用计算属性还是methods取决于是否需要缓存,当遍历大数组和做大量计算的时候,应当使用计算属性,除非你不希望得到缓存。

猜你喜欢

转载自blog.csdn.net/mrxuchen/article/details/80236112