比如说我们从后台拿到了文章正文内容,前台显示时只需要显示前面25个字符,怎么办?
之前我们的做法:
<h1 id="yz-hello" >{{body.substring(0,25)}}</h1>
data: {
body : '一起(17)帮(bang)是一个旨在直接解决编程/电脑操作等具体问题、互助式的虚拟社区平台。直接解决具体问题 '
}
如果使用计算属性,代码就变成这样:
<h1 id="yz-hello">{{summary}}</h1>
var vm = new Vue({
el: "#yz-hello",
data: {
body: '一起(17)帮(bang)是一个旨在直接解决编程/电脑操作等具体问题、互助式的虚拟社区平台。直接解决具体问题 '
},
computed: {
summary: function () {
return this.body.substring(0, 25);
}
}
})
可以简单的理解为:计算属性把以前在模板里面的工作给做了。
当然,计算属性可以做得更多:模板里面的JavaScript表达式只能是单行的,计算属性的复杂度不受任何限制。
computed: {
filtered: function () {
return this.students.filter(function (s, i) { //filter是JavaScript内置方法
return i > 1;
})
}
}
默认,我们是通过计算属性取值用。
但其实还可以给计算属性赋值:
computed: {
summary: {
get: function() {
return this.body.substring(0, 25);
},
set: function (value) {
console.log(value);
}
}
}
这样,当summary的值(因为表单输入/事件等原因)发生变动时,就会触发set函数(setter)。
之前未声明get/set的写法类似于只有get的简写。
控制台演示:修改vm.summary的值(如果没有定义setter还会报错)
或者你想起来了,computed好像也可以用methods代替?
确实如此,但他们两者有区别:计算属性是有缓存的。
设断点对比演示:
<span>{{now()}}</span> <!--methods-->
<span>{{now}}</span> <!--computed-->
//methods: {
computed: {
now: function () {
return Date.now();
}
}
F12控制台修改vm.greet的值:
但是注意:computed的缓存是依赖于vue data的。换言之,如果说vue data发生变化,由这些vue data计算生成的计算属性也要相应变化。
演示:修改body,summary会变动;修改title,summary不变动
data: {
title: '源栈欢迎你',
如果你不希望有缓存,就只能使用方法。
和computed也很类似。
但它需要指定被watch的vue data:
watch: {
// newBody == this.body:更改后的值
// oldBody:更改前的this.body
body: function (newBody, oldBody) {
this.summary = oldBody.substring(0, 25);
}
}
如上述代码,当vue data中body发生更改时,就会触发body:后面的方法。
watch还可以进行更多的设置,详见API文档。
|
|
computed |
methods |
watch |
|
缓存 |
有 |
没有 |
没有 |
|
异步 |
不行 |
不行 |
行 |
|
触发 |
模板使用:数据 |
模板使用:方法 |
被监控数据发生变动 |
|
灵活度 |
最低 |
高 |
最高 |
|
推荐度 |
最高 |
其次 |
最低(依赖关系容易变得复杂) |
@想一想@:为什么watch最强大最灵活,反而推荐度最低呢?
为了:可控/可读/可维护。框架的灵活和自由(复习)
延伸理解:戚家军/湘军募兵的时候,都只选憨厚老实的农家子弟,为什么?
多快好省!前端后端,线上线下,名师精讲
更多了解 加: