一、计算属性computed
computed
是计算属性,也就是计算值,多用于计算值的场景- 不支持异步,当
computed
内有异步操作时无效,无法监听数据的变化 computed
具有缓存性,computed
的值在getter
执行后是会缓存的,只有在它依赖的属性值改变之后,下一次获取computed
的值才会重新调用对应的getter
来计算。也就是说,只有依赖数据发生改变时,才会重新进行计算- 如果一个属性是由其他属性计算而来,这个属性依赖其他属性,一般用
computed
- 如果
computed
属性值是函数,那么默认会走get
方法,函数的返回值就是属性的属性值,在computed
中,属性都有一个get
和set
方法,当数据变化时调用set
方法 computed
适用于计算比较消耗性能的计算场景- 可以当属性直接使用
<body>
<script src="js/vue.js"></script>
<div id="app">
<input type="text" v-model="num1" />+
<input type="text" v-model="num2" />=
<input type="text" v-model="sum">
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
num1: 0,
num2: 0
},
computed:{
sum(){
let num3 = parseInt(this.num1)+parseInt(this.num2);
return num3;//必须有return
}
}
})
</script>
</body>
</html>
<body>
<script src="js/vue.js"></script>
<div id="app">
<input type="text" v-model="num1" />+
<input type="text" v-model="num2" />=
<input type="text" v-model="sum">
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
num1: 0,
num2: 0
},
/* 计算属性
get:会在获取属性值的时候调用,当依赖的属性发生变化的时候,会调用 getter
set:会在设置属性值的时候调用,当sum发生改变的时候,会调用setter,
setter中如果引起num1或者num2发生变化,会再次调用getter
*/
computed: {
sum: {
get: function () {
let num3 = parseInt(this.num1) + parseInt(this.num2);
return num3; //必须有return
},
set: function (newValue) {
console.log(newValue)
//this.num2 = newValue-this.num1;
}
}
}
})
</script>
</body>
</html>
示例
<script src="js/vue.js"></script>
<body>
<div id="app">
<h2>总价:{{totalPrice}}</h2>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
// 计算下面这些书籍的总价
books:[
{id: 101,name: 'Uinx编程技术',price: 108},
{id: 102,name: '代码大全',price: 99},
{id: 103,name: '深入理解计算机原理',price: 70},
{id: 104,name: '现代操作系统',price: 58},
]
},
// 计算属性,不同于方法,其类似于变量
computed: {
// 在定义计算属性时,一般不加动词get等,命名方式类似变量,在模板中也同变量一样使用
totalPrice: function(){
let result = 0;
for (i = 0; i < this.books.length; i++){
result += this.books[i].price;
}
return result;
}
}
})
</script>
</body>
</html>
二、watch监听属性
watch是一个侦听的动作,用来观察和响应Vue实例上的数据变动
- 更多的是"观察"的作用,类似于某些数据的监听回调,用于观察
props
、$emit
或者本组件的值,当数据来回变化时来执行回调进行后续操作 - 无缓存性,页面重新渲染时值不变化也会执行
- watch支持异步
- 监听的函数接收两个函数,第一个参数是新值,第二个参数是旧值
- 当一个属性发生变化时,需要执行对应的操作
应用场景 - 根据tab的切换,不管在哪个页面修改了数据,点击切换的时候要提示未保存,是否确认离开。这里就用到侦听器了,监听数据的变化
- 数据变化时执行异步或开销较大的数据:
- 验证用户名是否可用:需求:输入框中输入姓名,失去焦点时验证是否存在,如果已经存在,提示重新输入,如果不存在,提示可以使用
<body>
<script src="js/vue.js"></script>
<div id="app">
<div>
<span>名:</span>
<span>
<input type="text" v-model="firstName">
</span>
</div>
<div>
<span>姓:</span>
<span>
<input type="text" v-model="lastName">
</span>
</div>
<div>{{fullName}}</div>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
firstName: 'hello',
lastName: 'vue',
fullName: 'hello vue'
},
computed: {
// fullName: function(){
// return this.fullName = this.firstName + ' ' + this.lastName;
// }
},
watch: {
firstName(newval, oldval) {
//可以得到变化前后的值
console.log(newval,oldval);
this.fullName = newval + ' '+ this.lastName;
},
lastName(newval, oldval) {
//可以得到变化前后的值
console.log(newval,oldval);
this.fullName = this.firstName + ' '+ newval;
}
}
})
</script>
</body>
</html>
三、computed计算属性和watch监听属性的区别
computed计算属性 | watch监听属性 |
get函数中必须要有return | watch中的函数return可有可无 |
computed 计算属性名称可以自定义 | watch中的名称必须和data中的名称一致 |
computed 计算属性具备缓存 | watch不具备缓存 |
computed 计算属性适合处理一些复杂的数据运算 | watch适合处理一些消耗性能的需求,比如:Ajax请求等等 |
- 当要进行数值计算,而且依赖于其他数据,那么把这个数据设计为
computed
- 如果需要在某个数据变化时做一些事情,使用
watch
来观察这个数据变化