计算属性可以依赖多个Vue实例的数据,只要其中任一数据变化,计算属性就会重新执行,视图也会更新。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Vue Computed</title>
</head>
<body>
<div id="app">
总价:{{prices}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el:'#app',
data:{
package1:[
{
name:'iphone 7',
price:7199,
count:2
},
{
name:'sumgalx 9',
price:4800,
count:10
},
{
name:'ipad',
price:2888,
count:7
}],
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>
</body>
</html>
computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。当遍历大数组和做大量计算时,应当使用计算属性。
每一个计算属性都包含一个getter和一个setter,上面的实例都是计算属性的默认用法,只利用了getter来进行读取。在需要时可以通过setter函数执行一些自定义操作。
<div id="app">
姓名:{{fullName}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el:'#app',
data:{
firstName:'Jack',
lastName:'Green'
},
computed:{
fullName:{
get:function(){
return this.firstName+' '+this.lastName;
},
set:function(newValue){
var names = newValue.split(' ');//split() 方法用于把一个字符串分割成字符串数组。
this.firstName = names[0];
this.lastName = names[names.length - 1];
}
}
}
});
app.fullName='Jhon Doe';//当执行,则视图更新为该条数据。调用setter
</script>