所有计算属性都以函数的形式写在 Vue 实例内的 computed 选项内,最终返回计算后的结果
Vue的计算属性是通过函数来实现的,函数的返回值就是{{}}中的插值
<div id="app">
{{mytext}}
{{mydemo}}
div>
<script>
new Vue({
el:"#app",
data:{
text:"123,456,789",
demo:"abcdefg"
},
//添加计算属性,Vue的计算属性是通过函数来实现的,函数的返回值就是{{}}中的插值
computed:{
mytext:function(){
return this.text.split(',').reverse().join(',')
},
mydemo:function(){
return this.demo.toUpperCase()
}
}
})
script>
在一个计算属性里可以完成各种复杂的逻辑,包括逻辑运算、函数调用等,只要最终返回一 个结果就可以。除了上面的简单的用法,计算属性还可以依赖多个 vue 实例的数据,只要其中任 意一个数据变化,计算属性就会重新执行,视图也会更新。
计算商品总价
<div id="app">
商品总价:{{goodsTotal}}
div>
<script>
new Vue({
el:"#app",
data:{
package1:[
{
name:"华为mate20",
price:4566,
count:2
},
{
name:"华为p30",
price:4166,
count:2
}
],
package2:[
{
name:"iphone13",
price:7888,
count:3
},
{
name:"ipad2020",
price:3800,
count:1
}
]
},
computed:{
goodsTotal:function(){
let total = 0;
for(var i=0;i<this.package1.length;i++){
total +=this.package1[i].price * this.package1[i].count;
}
for(var i=0;i<this.package2.length;i++){
total +=this.package2[i].price * this.package2[i].count;
}
return total
}
}
})
script>
当 package1 或 package2 中的商品发生变化,比如购买数量变化或者增删商品时,计算属性 prices 就会自动更新,视图中的总价也会自动变化
每一个计算属性都包含一个getter和setter方法
FullName:{
get:function(){
return this.FirstName+' '+LastName;
}
}
相当于
FullName:function(){
return this.FirstName+' '+LastName;
}
<div id="app">
FirstName:
<input type="text" v-model="FirstName">
<br><br>
LastName:
<input type="text" v-model="LastName">
<br><br>
全名{{FullName}}
div>
<script>
//getter读取时触发
//setter写入时触发
new Vue({
el:"#app",
data:{
FirstName:"miss",
LastName:"bob"
},
computed:{
FullName:{
get:function(){
//getter方法用于读取数据,默认被调用
return this.FirstName+' '+this.LastName;
},
set:function(newName){
//setter方法,在设置属性值时该方法被调用
let names = newName.split(' ');
this.FirstName = names[0];
this.LastName = names[1];
}
}
}
})
script>
计算属性不仅可以依赖当前 Vue 实例的数据,还可以依赖其他 Vue 实例的数据
<div id="app1">
{{text}}
div>
<div id="app2">
{{t2}}
div>
<script>
var app1 = new Vue({
el:"#app1",
data:{
text:"abc,123"
}
});
var app2 = new Vue({
el:"#app2",
computed:{
t2:function(){
return app1.text.split(',').reverse().join('--')
}
}
})
script>
不希望得到缓存:使用计算属性
所谓侦听器(watch),就是当数据发生变化时,及时做出响应处理。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的!
watch:
<div id="app">
<input type="text" v-model="message">
<br>
<h3>{{state}}h3>
div>
<script>
new Vue({
el:"#app",
data:{
message:"hello",
state:"【未修改】"
},
watch:{
message:function(e){
this.state = "【已修改】"
}
}
})
script>
如果在监听器中更改监听数据的值时,显示修改后的数据
监听器还可以监听数组/对象
监听器不宜使用过多,因为会造成性能下降。
允许异步操作(访问一个API),限制我们执行该操作的频率