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

<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. Shiro实战教程(一)

    Shiro完整架构图 Shiro认证过程 Shiro授权的内部处理机制 Shiro 支持三种方式的授权 1.编程式:通过写if/else 授权代码块完成: Subject subject = Secu ...

  2. 推箱子 BFS

    [编程题] 推箱子 大家一定玩过“推箱子”这个经典的游戏.具体规则就是在一个N*M的地图上,有1个玩家.1个箱子.1个目的地以及若干障碍,其余是空地.玩家可以往上下左右4个方向移动,但是不能移动出地图 ...

  3. styled-components真的好吗?

    最近在学习react,然后遇到react中css该怎么写这个问题,上知乎上看了好多大牛都说styled-components好用是大势所趋. 但我自己用了感觉体验却很差,我在这里说说我为啥觉得styl ...

  4. JavaScript实现水平进度条拖拽效果

    <html> <head> <meta charset="UTF-8"> <title>Document</title> ...

  5. Ubuntu 17.10 用 apt 搭建 lamp 环境(精简版)

    这篇文章主要用来快速部署以 php 5.6 为主的 lamp 环境,要看详细安装包括虚拟主机配置的请参考这篇:http://www.cnblogs.com/mingc/p/7864030.html 一 ...

  6. STL hashtable阅读记录

    unordered_map,unordered_set等相关内容总结: unordered_map和unordered_set是在开发过程中常见的stl数据结构.其本质是hashtable.在SGI_ ...

  7. MySQL 约束类型

    约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性. MYSQL中,常用的几种约束: 约束类型: 主键 外键 唯一 非空 自增 默认值 关键字: primary key ...

  8. 在rhel7上搭建centos7的yum源

    1. 再查看现在主机上的yum源,并将它们删除 [root@localhost ~]# rpm -qa|grep yum | xargs rpm -e --nodeps # --nodeps 不管有没 ...

  9. windows 10开启bash on windows,配置sshd,部署hadoop

    1.安装Bash on Windows 这个参考官网步骤,很容易安装,https://msdn.microsoft.com/en-us/commandline/wsl/install_guide 安装 ...

  10. 如何删除git远程分支(转)

    1,在开发过程中,大家在远程创建了许多分支,有些是无用的,该如何删除呢,可以参考下面的方法. 如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放 稳 ...