从0开始学Vue系列5--计算属性

150 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

我要一步一步往上爬~大家好,今天我们来一起学习一下计算属性这个概念,拿下Computed用法。

一、计算属性

1. 定义

要用的属性不存在,所以要通过已有的属性加工得出的属性称为计算属性。data里面定义的就是属性,这里的firstName:'小'firstName属性名属性值

data:{
    firstName:'小',
    lastName:'李',			
}

computed是一项全新的配置项,代码是不和data写在一起的,内部把计算的整个过程写成对象的形式,这里表现为fullname

computed:{
    fullName:{
    }
}

2. 原理

对象里面要写个get()方法,它的作用是当有人读取fullname对象时,会自动调用getget的返回值就作为fullname对象的值。这里的底层原理其实就是Objcet.defineproperty方法提供的gettersetter

computed:{
    fullName:{
        get(){},
        set(value){}
    }
}

3. 优势

与使用methods实现相同结果对比,computed的效率更高,调试起来更方便,因为它内部具备缓存机制,也就是缓存的数据可以复用。

methods读取一次满勤会调用一次,而get只有在被初次读取里面的对象(这里是fullName)时以及所依赖的数据发生变化时,这两种情况下才会被调用。

对应的,set是在fullName被修改时被调用,value就是接收到的值,举个栗子,在网页的console中输入vm.fullname=小 张,set被调用修改fullname

get(){
    console.log(this) 
    return this.firstName + ' ' + this.lastName
},
set(value){
    console.log('set',value)
    const arr = value.split(' ')
    this.firstName = arr[0]
    this.lastName = arr[1]
}

4. 注意点

get中不能写成return firstName + lastName,这样会报错没有被定义,this代表vm实例,vm实例上的属性是可以直接使用的,所以要写成this.firstName这种形式。

图片2.png

5. 简写形式

在不使用set的情况下,我们可以将computed代码段写成如下形式,更加简便

fullName(){
    return this.firstName + '-' + this.lastName
}

二、完整案例

<body>
<div id="root">
    姓:<input type="text" v-model="firstName"> <br/><br/>
    名:<input type="text" v-model="lastName"> <br/><br/>
    全名:<span>{{fullName}}</span> <br/><br/>
</div>
</body>

<script type="text/javascript">
const vm = new Vue({
    el:'#root',
    data:{
        firstName:'小',
        lastName:'李',			
    },
    computed:{
        fullName:{
            get(){
                console.log(this) 
                return this.firstName + ' ' + this.lastName
            },
            set(value){
                    console.log('set',value)
                    const arr = value.split(' ')
                    this.firstName = arr[0]
                    this.lastName = arr[1]
            }
        }
    }
})
</script>

效果图:

图片3.png