ch4-计算属性(表达式计算 computed methods watchers)
1 计算属性
1.1 模板内的表达式是非常便利的,但是它们实际上只用于简单的运算。
在模板中放入太多的逻辑会让模板过重且难以维护。
<div id="test1">
{{str.split('').reverse().join('')}}
</div> <script>
let app1 = new Vue({
el: '#test1',
data: {
str: 'hello world'
}
});
</script>
这种写法的弊端:
在这种情况下,模板不再简单和清晰。在意识到这是反向显示 str 之前,
你不得不再次确认第二遍。当你想要在模板中多次反向显示 str 的时候,
问题会变得更糟糕。 这就是对于任何复杂逻辑,你都应当使用计算属性的原因。 1.2 基本计算属性
<div id="test2">
<p>原始的效果:{{str}}</p>
<p>反转后的效果:"{{reverse}}"</p>
</div> <script>
let app2 = new Vue({
el: '#test2',
data: {
str: 'hello world'
},
computed: {
//computed的getter
reverse: function () {
return this.str.split('').reverse().join('');
}
}
});
</script>
这里声明了一个计算属性 reverse。
提供的函数将用作属性 vm.reverse 的 getter 。
可以打开浏览器的控制台,自行修改例子中的 app2 。
app2.reverse 的值始终取决于 app2.str 的值。
可以像绑定普通属性一样在模板中绑定计算属性。
Vue 知道 app2.reverse 依赖于 app2.str ,因此当 app2.str 发生改变时,所有依赖于 app2.reverse 的绑定也会更新。
而且最妙的是我们已经以声明的方式创建了这种依赖关系:计算属性的 getter 是没有副作用,这使得它易于测试和推理。

1.3 计算缓存(计算属性) vs Methods 可以通过调用表达式中的 method 来达到同样的效果
<div id="test2">
<p>原始的效果:{{str}}</p>
<p>反转后的效果:"{{reverse}}"</p>
<p>反转后的效果:"{{reverseMe()}}"</p>
</div> <script>
let app2 = new Vue({
el: '#test2',
data: {
str: 'hello world'
},
computed: {
reverse: function () {
return this.str.split('').reverse().join('');
}
},
methods: {
reverseMe: function () {
return this.str.split('').reverse().join('');
}
}
});
</script>

我们可以将同一函数定义为一个 method 而不是一个计算属性。对于最终的结果,两种方式确实是相同的。
然而,不同的是计算属性是基于它们的依赖进行缓存的。
计算属性只有在它的相关依赖发生改变时才会重新求值。
这就意味着只要 str 还没有发生改变,多次访问 reverse 计算属性会立即返回之前的计算结果,而不必再次执行函数。 相比而言,只要发生重新渲染,method 调用总会执行该函数。
我们为什么需要缓存?假设我们有一个性能开销比较大的的计算属性 A ,它需要遍历一个极大的数组和做大量的计算。
然后我们可能有其他的计算属性依赖于 A 。
如果没有缓存,我们将不可避免的多次执行 A 的 getter!
如果你不希望有缓存,请用 method 替代。
1.4 Computed 属性 vs Watched 属性
Vue 确实提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:watch 属性。
当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch——特别是如果你之前使用过 AngularJS。
然而,通常更好的想法是使用 computed 属性而不是命令式的 watch 回调。 比较例子:
<div id="test4">{{fullName}}</div>
<div id="test5">{{fullName}}</div>
<script>
let app4 = new Vue({
el: '#test4',
data: {
firstName: 'Jeson',
lastName: 'hu',
fullName: 'Jesonhu'
},
watch: {
firstName: function (val) {
this.fullName = val +' '+ this.lastName;
},
lastName: function (val) {
this.fullName = this.firstName +' '+ val;
}
}
});
let app5 = new Vue({
el: '#test5',
data: {
firstName: 'Jeson',
lastName: 'hu'
},
computed: {
fullName: function () {
return this.firstName +' '+ this.lastName;
}
}
});
</script>
1.5 计算 setter
计算属性默认只有 getter ,不过在需要时你也可以提供一个 setter
<div id="test6">{{fullName}}</div>
<script>
let app6 = new Vue({
el: '#test6',
data: {
firstName: 'Jeson',
lastName: 'hu'
},
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>
现在在运行 app6.fullName = 'John Doe' 时, setter 会被调用,
app6.firstName 和 app6.lastName 也相应地会被更新。 2 观察 Watchers
虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的 watcher 。
这是为什么 Vue 提供一个更通用的方法通过 watch 选项,来响应数据的变化。
当你想要在数据变化响应时,执行异步操作或开销较大的操作,这是很有用的。
ch4-计算属性(表达式计算 computed methods watchers)的更多相关文章
- vue教程2-03 vue计算属性的使用 computed
vue教程2-03 vue计算属性的使用 computed computed:{ b:function(){ //默认调用get return 值 } } ---------------------- ...
- LeetCode_p150_逆波兰表达式计算/后缀表达式计算
有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除 ...
- Vue.js 源码分析(六) 基础篇 计算属性 computed 属性详解
模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护,比如: <div id="example">{{ messag ...
- vue.js计算属性 vs methods
计算属性:Vue.js 模板内的表达式非常便利,但是缺点就是只能用于简单的运算,如果模板中有太多的逻辑运算会让模板不堪重负且难以维护.恰恰计算属性可以处理复杂的逻辑运算,也就是说对于任何复杂逻辑你都应 ...
- Vue之计算属性Computed和属性监听Watch,Computed和Watch的区别
一. 计算属性(computed) 1.计算属性是为了模板中的表达式简洁,易维护,符合用于简单运算的设计初衷. 例如: <div id="app"> {{ myname ...
- computed计算属性
在computed中,可以定义一些属性,这些属性 叫做计算属性.计算属性的本质是一个方法,只不过我们在使用的时候,把他们的名称当做属性来使用,并不会吧计算属性当做方法去调用.与methods平级. / ...
- 深入理解 Vue Computed 计算属性
Computed 计算属性是 Vue 中常用的一个功能,我们今天来说一下他的执行过长 拿官网简单的例子来看一下: <div id="example"> <p> ...
- vue之computed(计算属性)
所谓计算属性就是计算data里的数据属性. computed:实时监听的该功能. 即监听是否有修改(浏览器未打开时即开始监听了),监听的值有修改则添加 所监听的data数据属性变化了,自动实时修改. ...
- 计算属性computed
computed 在Vue中有多种方法为视图设置值: 1.使用指令直接将数据值绑定到视图 2.使用简单的表达式对内容进行简单的转换 3.使用过滤器对内容进行简单的转换 除此之外,我们还可以使用计算属性 ...
随机推荐
- Spring @ResponseBody 返回中文乱码问题
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt102 今天在使用spring 的时候,发现中文返回的是乱码. 经过研究发现, ...
- 在tomcat7中启用HTTPS的详细配置
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt385 最简单的方法,直接用java里的keytool工具生成一个keysto ...
- Python闭包及其作用域
Python闭包及其作用域 关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域 ...
- poj3249 拓扑排序+DP
题意:给出一个有向无环图,每个顶点都有一个权值.求一条从入度为0的顶点到出度为0的顶点的一条路径,路径上所有顶点权值和最大. 思路:因为是无环图,则对于每个点经过的路径求其最大权值有,dp[i]=ma ...
- 聊一聊我们都熟知的 “ Java分层 ”
一.为什么要分层. 以前的我们,写代码的时候,都在main()方法中,出现了错误,就慢慢调试,这样浪费了我们很长的时间,而我们程序员的时间是非常宝贵的 但是当我们使用分层架构的时候,就可以清晰明确的知 ...
- 即时作图新工具—ProcessOn【推荐】…
www.processon.com 推荐这个在线作图网站:免费登录,云端存储,面向对象,最重要的是提供了丰富模板! 在线软件的人气会越来越高,这是趋势啊~
- 分而治之(Work Breakdown Structure, WBS)
不知道大家有没有和我一样的情况,就是想写一篇博客,不知道从何写起,如何组织语言,如何安排这篇博客的要交待的事情的前因后果:如果在写作过程中被打断,又不知道如何重新拾起键盘,从哪里写起."就如 ...
- 集美大学网络1413第七次作业成绩(团队三) --需求改进&系统设计
题目 团队作业3--需求改进&系统设计 团队作业3成绩 团队/分值 TD BZ GJ CJ SI WBS GS JG DB SS SJ CS DC 总分 1 0.25 0.75 1 0.5 ...
- 【Beta】Daily Scrum Meeting——Day3
站立式会议照片 1.本次会议为第三次Meeting会议: 2.本次会议在早上9:40,在陆大实验室召开,本次会议为25分钟讨论今天要完成的任务以及接下来的任务安排. 燃尽图 每个人的工作分配 遇到的困 ...
- 在linux下通过hexdump生成一个十六进制的文本保存文件,解析此文件转变成正常源代码文件。
举例说明: 此十六进制保存的文件为此源代码hexdump生成的: #include<stdio.h> #include<string.h> #include<stdlib ...