{{}}模板内的表达式常用于简单的运算,当运算过长或逻辑复杂时,会难以维护。

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

  这个表达式包含3个操作,在遇到复杂逻辑时应该使用计算属性。上面的例子可以用计算属性进行改写:

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

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

用法

  在一个计算属性里可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果就可以。

  计算属性可以依赖多个Vue实例的数据,只要其中任一数据变化,计算属性就会重新执行,视图也会更新。

<div id = "app">
总价:{{ prices }}
</div>
<script>
var app = new Vue({
el: '#app',
data:{
package1:[
{
name:'iphone 7',
price:7199,
count:2
},
{
name:'ipad',
price:2888,
count:1
}
],
package2:[
{
name:'apple',
price:3,
count:5
},
{
name:'banana',
price:2,
count:10
}
]
},
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>

  当package1或package2中的商品有任何变化,比如购买数量变化或增删商品时,计算属性prices就会自动更新,视图中的总价也会自动变化。

计算属性的get、set

  每个计算属性都包含一个getter和一个setter,上面的实例都是计算属性的默认用法,只利用了getter来读取。在需要的时候,可以提供一个setter函数,当手动修改计算属性的值就像修改一个普通数据那样,会触发setter函数,执行一些自定义操作。

<div id = "app">
姓名:{{ fullName }}
</div>
<script>
var app = new Vue({
el: '#app',
data:{
firstName:'Jack',
lastName:'Green'
},
computed:{
fullName:{
//getter,用于读取
get: function(){
return this.firstName + ' ' + this.lastName;
},
//setter,写入时触发
set: function(newValue){
var names = newValue.split(' ');
this.firstName = names[0];
this.lastName = names[names.length - 1];
}
}
}
})
</script>

  当执行app.fullName = 'John Doe';时,setter就会被调用,数据firstName和lastName都会相对更新,视图同样也会更新。

  绝大多数情况下,我们只会用默认的getter方法来读取一个计算属性,在业务中很少用到setter,所以声明一个计算属性时,可以直接使用默认的写法,不必将getter和setter都声明。

  计算属性有两个很实用的小技巧:

    ♦ 计算属性可以依赖其他计算属性

    ♦ 计算属性可以依赖其他Vue实例

<div id="app1"></div>
<div id="app2">
{{ reversedText }}
</div>
<script>
var app1 = new Vue({
el: '#app1',
data:{
text: '123,456'
}
});
var app2 = new Vue({
el: '#app2',
computed: {
reversedText: function(){
//这里依赖的是实例app1的数据text
return app1.text.split(',').reverse().join(',');
}
}
})
</script>

  这里创建了两个Vue实例app1和app2,在app2的计算属性reversedText中,依赖的是app1的数据text,所以当text变化时,实例app2的计算属性也会变化。

缓存

  刚学计算属性的时候,我有这样一个疑问,methods里的方法可以与计算属性起到同样的作用。

<div id = "app">
<!-- 这里的reversedText是方法,需要带() -->
{{ reversedText() }}
</div>
<script>
var app = new Vue({
el: '#app',
data:{
text:'123,456'
},
methods:{
reversedText: function(){
//这里的this指向的是当前的Vue实例
return this.text.split(',').reverse().join(',');
}
}
})
</script>

  没有使用计算属性,在methods里定义了一个方法实现了相同的效果,甚至该方法还可以接受参数,使用起来更灵活。既然使用methods就可以实现,为什么还需要计算属性。原因就是计算属性是基于它的依赖缓存的。一个计算属性所依赖的数据发生变更时,它才会重新取值,所以text只要不改变,计算属性也就不更新。

computed: {
now: function() {
return Date.now();
}
}

  这里的Date.now()不是响应式依赖,所以计算属性now不会更新。但是methods则不同,只要重新渲染,它就会被调用,因此函数也会被执行。

  使用计算属性还是methods取决于是否需要缓存,当遍历大数组和做大量计算时,应当使用计算属性,除非不想得到缓存。

Vue 2.0学习(四)计算属性的更多相关文章

  1. vue2.0中的计算属性

    计算属性是一个很邪门的东西,只要在它的函数里引用了data中的某个属性,当这个属性发生变化的时候,函数仿佛可以嗅探到这个变化,并自动重新执行. 上代码会源源不断的打印出a的值.如果希望b依赖data中 ...

  2. 【Vue】Vue框架常用知识点 Vue的模板语法、计算属性与侦听器、条件渲染、列表渲染、Class与Style绑定介绍与基本的用法

    Vue框架常用知识点 文章目录 Vue框架常用知识点 知识点解释 第一个vue应用 模板语法 计算属性与侦听器 条件渲染.列表渲染.Class与Style绑定 知识点解释 vue框架知识体系 [1]基 ...

  3. VUE 学习笔记 四 计算属性和监听器

    1.计算属性 对于任何复杂逻辑,你都应当使用计算属性 <div id="example"> <p>Original message: "{{ me ...

  4. vue学习笔记 计算属性(四)

    计算属性就是vue实例里的computed属性,对应一个对象,里面可以放各种方法,方法的作用就是可以生成和数据变量对应的计算后的变量,跟数据相关的复杂逻辑变量,都可以使用计算属性实现,computed ...

  5. Vue学习之--------计算属性(2022/7/9)

    文章目录 1.计算属性 1.1 计算属性实现 1.1.1 基础知识 1.1.2 代码实例 1.1.3 测试效果 1.2 计算属性简写 1.2.1 简写代码 1.3 使用插值语法实现 1.3.1 代码实 ...

  6. Vue.js学习 Item5 -- 计算属性computed与$watch

    在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护.这就是为什么 Vue.js 将绑定表达式限制为一个表达式.如果需 ...

  7. VUE学习之计算属性computed

    计算属性:computed 先看一下官网的说法 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="ex ...

  8. vue入门(二)----模板与计算属性

    其实这部分内容我也是参考的官网:http://cn.vuejs.org/v2/guide/syntax.html,但是我还是想把自己不懂的知识记录一下,加深印象,也可以帮助自己以后查阅.所谓勤能补拙. ...

  9. Vue.js 生命周期、计算属性及侦听器

    一.创建一个Vue实例 每个Vue应用都是使用Vue函数创建一个Vue实例.所有的Vue组件都是一个Vue实例,并且接受相同的选项对象(一些根实例特有的选项除外). 数据和方法 当一个实例被创建后,它 ...

随机推荐

  1. Python学习笔记(2.1)函数参数练习

    关键字参数 和 命名关键字参数 # -*- coding: utf-8 -*- def print_scores(**kw): print(' Name Score') print('-------- ...

  2. H5多媒体

    Video <video width="500px" controls="controls"> <source src="test. ...

  3. 20155117王震宇 2006-2007-2 《Java程序设计》第5周学习总结

    教材学习内容总结 try & catch java中的错误会被打包成对象,可以尝试(try)捕捉(catch)代表错误的对象后做一些处理.如果发生错误,会跳到catch的区块并执行. 异常结构 ...

  4. ASP.Net Cache(缓存)—ASP.NET细枝末节(2)

    概述 1.意义 把数据放到Cache中,在指定的时间内,可以直接从Cache中获取,避免对数据库等的压力. 2.做法 设置: HttpRuntime.Cache.Insert(CacheKey, ob ...

  5. 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)

    题目链接 Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e ...

  6. BeanPostProcessor的五大接口

    BeanPostProcessor 关于对象初始化前后的回调. public interface BeanPostProcessor { //该方法在bean实例化完毕(且已经注入完毕),在after ...

  7. Codeforces Round #466

    A. Points on the line 题意 给定一条直线上\(n\)个点,要求去掉最少的点,使得直线上相距最远的两个点的距离\(\leq d\). 思路 枚举长度为\(d\)的区间. Code ...

  8. C# 加密解密以及sha256不可逆加密案例

    class Program { static void Main(string[] args) { string aa = "身份证"; string bb = "key ...

  9. sicily 1240. Faulty Odometer

    Description You are given a car odometer which displays the miles traveled as an integer. The odomet ...

  10. 集合框架之Set学习

    前言:         1.何为框架:可以理解为一个基础结构,在基础结构上进行进一步开发会变得很方便. 2.三种集合类型:集合(Set) :元素无序不可重复: 列表(List) :元素有序可重复: 映 ...