vue学习记录-04 计算属性

vue学习记录-04 计算属性

这篇文章是根据codewhy老师在b站的视频进行的学习记录



一、计算属性的基本使用

我们知道,mustache语法支持简单的运算的。

        <h2>{{firstName+' '+lastName}}</h2>
        <h2>{{firstName}} {{lastName}}</h2>

现在看起来现在仅仅只是将两个数据进行一个拼接,但是如果之后有什么比较复杂的数据处理,需要在mustache中放入过多的表达式进行运算才能使用,那么自然是不利于程序员维护的。
下面也仅仅只是一个自我介绍时用到的简单的字符串拼接,想想如果还要再加上各种方法呢?

        <h2>{{firstName+' '+lastName+'myage:'+age+'岁'+'...(这人自我介绍挺啰嗦的,中间省略200字)'+',自我介绍结束'}}</h2>

因此,在mustache中只需要表达出这里放的是什么东西就足够了,如果数据需要进行处理才能放入mustache中,那么VUE建议使用计算属性进行处理后再使用。
例如这样:

<h2>{{fullName}}</h2>
data: {
                firstName:'Lebron',
                lastName:'James'
            },
computed:{
                fullName:function(){
                    return this.firstName+' '+this.lastName
                }
            },

我们使用计算属性能做的事使用方法也是可以实现的。

<h2>{{getFullName()}}</h2>
methods:{
                getFullName(){
                    return this.firstName+' '+this.lastName
                }
            }

与方法不同,计算属性仅仅只是一个属性而不是一个要执行的动作,因此,计算属性我们在命名时最好使用名词,而不是动词。
计算属性与methods方法还有一些其他方面的不同,文章后面我们将会进行对比。

二、计算属性的复杂操作

计算属性可以进行一些更复杂的操作,我们拿个案例进行演示。
假设现在有一个书店收银系统,其他的功能都做好了,只剩一个计算全部书籍价格的小功能,组长把这个功能交给我们去实现,那么我们需要怎么做呢?
代码如下:

<div id='app'>
        <h2>总价格:{{totalPrice}}</h2>
    </div>
const app = new Vue({
            el: '#app',
            data: {
                books:[
                    {id:110,name:"VUE",price:119},
                    {id:111,name:"Linux",price:159},
                    {id:112,name:"JAVA",price:419},
                    {id:113,name:"GIT",price:24},
                ]
            },
        computed:{
			totalPrice(){}
		}    
 })

我们应该怎么实现totalPrice呢?
当然是将顾客买的书的价格全部加在一起。

	this.books[0].price+this.books[1].price+this.books[2].price+this.books[3].price

这样虽然是可以,但是代码很不灵活,毕竟不可能每次都只买这些书吧?除非书店只有这四本书买的同时要求顾客必须一起买(比如老师要求买教材资料?)。

所以我们可以使用for循环对books的价格进行求和。

	let result=0
    for(let i=0;i<this.books.length;i++){
        result +=this.books[i].price
    }
    return result

或者使用for…in循环,这样我们可以很方便的通过键名获取键值进行额外的操作。

	let result=0;
    for(let i in this.books){
         result +=this.books[i].price
     }
     return result

在ES6中,支持使用for of循环直接获取键值。

     let result=0;
     for(let book of this.books){
         result +=book.price
     }
     return result

前面提到过,计算属性中也可以使用方法函数,所以要实现这个功能,最简单的方法还是使用reduce方法。

	return this.books.reduce((prev, cur) => prev+cur.price,0)

关于reduce方法:
写法:数组.reduce(callback,initialValue)
callback:一个回调函数,作用是执行数组中每个值的函数,包含四个参数
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
initialValue:即初始值,第一次调用callback时使用的值

三、计算属性的setter和getter

计算属性本质上是一个属性而非函数,所以作为一个属性,它是有setter方法和getter方法的,不过我们通常默认计算属性是只读的,所以基本上我们不会去实现的他的setter方法,只会作为getter方法去实现,这个作为了解即可。
简洁写法(不包含setter方法):

<div id='app'>
        {{fullName}}
    </div>
const app = new Vue({
            el: '#app',
            data: {
                firstName:'Kobe',
                lastName:'Bryant'
            },
            computed:{
                fullName:function(){
                    return this.firstName+' '+this.lastName
                }
            }
        })

同时,在调用计算属性时,由于它不是函数,所以不需要再在后面加小括号

计算属性完整写法(包含setter方法):

fullName:{
    //计算属性一般没有set方法,即只读属性,不希望改变属性
    // set:function(){},
    set:function(newValue){
        console.log('传入参数:',newValue);
        const names=newValue.split(' ');
        this.firstName=names[0];
        this.lastName=names[1];
    },
    //一般只需要使用get方法
    get:function(){
        return this.firstName+' '+this.lastName
    }
}

四、计算属性和methods的对比

关于计算属性与methods的对比,首先我们需要回想起来,我们为什么要使用计算属性?
如果直接在html拼接数据,语法会过于繁琐,而且html不要在写过多逻辑处理。

        <h2>{{firstName+'这里是一堆乱七八糟的逻辑处理'+lastName}}</h2>

那么计算属性与methods有什么不同呢?换句话说,既然methods能做到跟计算属性一样的事,那么为什么VUE还要专门写一个计算属性呢?
先简单说下结论:计算属性性能更优,methods性能更低。
下面直接放代码:

<div id='app'>
        <h2>{{getFullName()}}</h2>
        <h2>{{getFullName()}}</h2>
        <h2>{{getFullName()}}</h2>
        <h2>{{getFullName()}}</h2>

        <h2>{{fullName}}</h2>
        <h2>{{fullName}}</h2>
        <h2>{{fullName}}</h2>
        <h2>{{fullName}}</h2>
    </div>
        const app = new Vue({
            el: '#app',
            data: {
                firstName:'Kobe',
                lastName:'Bryant'
            },
            methods:{
                getFullName:function(){
                    console.log("getFullName");
                    return this.firstName+' ' +this.lastName
                }
            },
            computed:{
                fullName:function(){
                    console.log("fullName");
                    return this.firstName+' '+this.lastName
                }
            }
        })

在控制台中,我们可以看到,getFullName打印了四次,而fullName只打印了一次:
计算属性
为什么呢?

因为通过定义methods实现的数据处理,调用了几次就会执行几次,每次都会重新计算,性能更低。
而通过计算属性实现数据处理,只会调用一次,因为VUE做了缓存,会观察数据是否有变化,没有变化就不会调用,性能更优。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值