Vue 2.0学习(四)计算属性
{{}}模板内的表达式常用于简单的运算,当运算过长或逻辑复杂时,会难以维护。
<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学习(四)计算属性的更多相关文章
- vue2.0中的计算属性
计算属性是一个很邪门的东西,只要在它的函数里引用了data中的某个属性,当这个属性发生变化的时候,函数仿佛可以嗅探到这个变化,并自动重新执行. 上代码会源源不断的打印出a的值.如果希望b依赖data中 ...
- 【Vue】Vue框架常用知识点 Vue的模板语法、计算属性与侦听器、条件渲染、列表渲染、Class与Style绑定介绍与基本的用法
Vue框架常用知识点 文章目录 Vue框架常用知识点 知识点解释 第一个vue应用 模板语法 计算属性与侦听器 条件渲染.列表渲染.Class与Style绑定 知识点解释 vue框架知识体系 [1]基 ...
- VUE 学习笔记 四 计算属性和监听器
1.计算属性 对于任何复杂逻辑,你都应当使用计算属性 <div id="example"> <p>Original message: "{{ me ...
- vue学习笔记 计算属性(四)
计算属性就是vue实例里的computed属性,对应一个对象,里面可以放各种方法,方法的作用就是可以生成和数据变量对应的计算后的变量,跟数据相关的复杂逻辑变量,都可以使用计算属性实现,computed ...
- 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 代码实 ...
- Vue.js学习 Item5 -- 计算属性computed与$watch
在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护.这就是为什么 Vue.js 将绑定表达式限制为一个表达式.如果需 ...
- VUE学习之计算属性computed
计算属性:computed 先看一下官网的说法 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="ex ...
- vue入门(二)----模板与计算属性
其实这部分内容我也是参考的官网:http://cn.vuejs.org/v2/guide/syntax.html,但是我还是想把自己不懂的知识记录一下,加深印象,也可以帮助自己以后查阅.所谓勤能补拙. ...
- Vue.js 生命周期、计算属性及侦听器
一.创建一个Vue实例 每个Vue应用都是使用Vue函数创建一个Vue实例.所有的Vue组件都是一个Vue实例,并且接受相同的选项对象(一些根实例特有的选项除外). 数据和方法 当一个实例被创建后,它 ...
随机推荐
- HTML 5 Web 存储:localStorage和sessionStorage
本文内容摘自http://www.w3school.com.cn/ 在客户端存储数据 HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessi ...
- 针对移动设备的CSS3布局
针对移动设备的CSS3布局 一些专业人士预测五年内移动设备将击败普通电脑成为网页浏览领域的霸主,不管这个预言是否应验,让网页在移动设备上较好的显示已经成为网页设计师和开发者的重要任务,本教程学习用CS ...
- JSON 为王,为什么 XML 会慢慢淡出人们的视野?
目前全球信息基础设施的特点是,拥有大量的数据交换格式.这一点也不奇怪.互联网几乎已经老了,而“物联网”及“大数据”正从概念走进现实.但我仍然相信,在这一领域还有一股较强的历史趋势,推动 JSON 数据 ...
- [php]apache虚拟主机配置
1.所谓虚拟主机的配置,即url与磁盘目录的绑定 2.在httpd.conf中查询Virtual host,发现有注释说明需要在conf/extra/httpd-vhosts.conf中进行配置. 3 ...
- 微信小程序导航设置
"tabBar": { "backgroundColor": "#ffffff", "color": "#00 ...
- script标签中type为<script type="text/x-template">是个啥
写过一点前端的都会碰到需要使用JS字符串拼接HTML元素然后append到页面DOM树上的情况,一般的写法都是使用+号以字符串的形式拼接,如果是短点的还好,如果很长很长的话就会拼接到令人崩溃了. 比如 ...
- AngularJs 文件上传(实现Multipart/form-data 文件的上传)
<!-- 上传yml文件 --> <div class="blackBoard" ng-show="vm.showUpop==true"> ...
- 63.UniquePaths II---dp
题目链接 题目大意:与62题类似,只是这个题中间有障碍. 法一:dfs,依旧超时.代码如下: public int uniquePathsWithObstacles(int[][] obstacleG ...
- Python学习笔记——数据结构和算法(二)
1.字典中一个键映射多个值 可以使用collections中的defaultdict来实现,defalultdict接受list或者set为参数 from collections import def ...
- git clone的
git clone git@e.coding.net:wudi360/*******.git