Vue2基础 05:计算属性

前面学了插值语法,模板中的表达式虽然方便,但也只能用来做简单的操作。
如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。
因此Vue推荐使用 计算属性 来描述复杂逻辑。

1 总体介绍

Vue认为 data 配置项内的就是属性,格式为属性名:属性值

  1. 定义:对已经写好的data属性,经过加工计算,生成一个新的属性
  2. 原理:底层借助了Object.defineproperty方法提供的gettersetter
  3. 优势:与methods相比,被调用后会在网页上缓存,相同的计算属性只调用一次get ( ),效率更高,调试方便
  4. get( ){ }被调用的条件:
    (1)初次读取会执行一次
    (2)当依赖的数据发生改变时会再次被调用
  5. 备注
    (1)计算属性最终会出现在Vue实例上,直接读取即可
    (2)get( ){ }里的this默认指向该vue实例
    (3)如果计算属性要被修改,必须写set函数去相应修改,且set{}中要写对应的改变计算依赖的数据的语句

2 插值语法、methods、计算属性横向对比

下面通过拼姓和名成全名的案例,来横向对比一下三种实现方法的差异。

2.1 插值语法实现

<body>
    <div id="root">
        姓:<input type="text" v-model="firstname" > <br/><br/>
        名:<input type="text" v-model="lastname" ><br/><br/>
        全名:<span>{{firstname.slice(0,3)}}-{{lastname}}</span>
        //或者{{firstname + '-' + lastname}}
        //slice(a,b)表示截取从a开始的长度为b的字符串
    </div>
</body>

<script type="text/javascript" src="../vue.js">
    new Vue({
        el:'#root',  
        data:{ 
            firstname:'张',
            lastname:'三'
        }
    })
</script>

模板要尽可能简单,所以{{ }}里的不能太长,这种情况也就不推荐这种方法。

2.2 methods实现

<body>
    <div id="root">
        姓:<input type="text" v-model="firstname" > <br/><br/>
        名:<input type="text" v-model="lastname" ><br/><br/>
        全名:<span>{{fulName()}}</span>
        //此处不是事件绑定,所以需要加括号
    </div>
</body>

<script type="text/javascript" src="../vue.js">
    new Vue({
        el:'#root',  
        data:{ 
            firstname:'张',
            lastname:'三'
        },
        methods:{
            fulName(){
                return this.firstname + '-' + this.lastname
            }
        }
    })
</script>

此时的联动效果:

在页面直接修改input的值
实例的data发生改变
模板重新解析
页面用到data处更新
模板重调插值语法里的方法

2.3 计算属性实现

<body>
    <div id="root">
        姓:<input type="text" v-model="firstname" > <br/><br/>
        名:<input type="text" v-model="lastname" ><br/><br/>
        全名:<span>{{fulName}}</span>
        //计算属性fulname同样属于vue的属性,可以写成插值语法
    </div>
</body>

<script type="text/javascript" src="../vue.js">
    new Vue({
        el:'#root',  
        data:{ 
            firstname:'张',
            lastname:'三'
        },
        computed:{
            fulname:{
                get(){
                    return this.firstname + '-' + this.lasname
                },
                set(){
                    const arr = value.split('-')
                    //按照'-'切分字符串为数组
                    this.firstname = arr[0]
                    this.lastname = arr[1]
                }
            }
        }//专门放计算属性,属性写成对象的格式
    })
</script>

3 计算属性的简写

前提:只读取,不修改(只用get( ),不用get( ) )
用法:函数直接当getter()用

fulname(){
	//return ...
	//逻辑代码
}

对上面的案例进行改写:

computed:{
   //精简的
   fulname(){
        return this.firstname + '-' + this.lasname
   }//函数直接当getter()用
            
   //原来的
   fulname:{
        get(){
              return this.firstname + '-' + this.lasname
        }
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值