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

<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. lazyload support for Zepto.js

    关于lazyload,很久之前整理过它的文档:<Lazy Load(1.7.0)中文文档 -- 延迟加载图片的jQuery插件> 因为懒,所以才要用lazyload.但lazyload用了 ...

  2. 查询timestamp类型数据

    $where=" roleid = 8 and lizhi = 0 and branchid IN (".implode(",",$ids).") a ...

  3. 【洛谷 P2512】 [HAOI2008]糖果传递(贪心)

    题目链接 环形均分纸牌. 设平均数为\(ave\),\(g[i]=a[i]-ave\),\(s[i]=\sum_{j=1}^ig[i]\). 设\(s\)的中位数为\(s[k]\),则答案为\(\su ...

  4. MOD - Power Modulo Inverted(SPOJ3105) + Clever Y(POJ3243) + Hard Equation (Gym 101853G ) + EXBSGS

    思路: 前两题题面相同,代码也相同,就只贴一题的题面了.这三题的意思都是求A^X==B(mod P),P可以不是素数,EXBSGS板子题. SPOJ3105题目链接:https://www.spoj. ...

  5. Paramiko使用

    1.下载安装 pycrypto-2.6.1.tar.gz (apt-get install python-dev) 解压,进入,python setup.py build[编译],python set ...

  6. vue--------脚手架vue-cli搭建

    今天在看公司的项目的时候,用到的是Vue框架,哈哈,Vue已经火好久了,想必大家也晓得哈,这里宝宝就不瞎渣渣了~ 由于宝宝已经三个月木有看过代码了,所以对新公司的很多的架构和代码都是懵逼的,再加上宝宝 ...

  7. L - Looking for Taste Gym - 101991L 二进制枚举/思维

    方法一:因为最多是10的六次方,所以可以直接枚举二进制上的每一位来得到最优结果. AC代码: #include<iostream> #include<stack> #inclu ...

  8. password passphrase passcode 的区别

    In general, passphrases are long passwords and passcodes are numeric-only passwords.

  9. linux内存分配方法总结【转】

    转自:http://www.bkjia.com/Linuxjc/443717.html 内存映射结构: 1.32位地址线寻址4G的内存空间,其中0-3G为用户程序所独有,3G-4G为内核占有. 2.s ...

  10. Django Authentication 用户认证系统

    一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...