Vue 计算属性computed和监听属性watch比较
1、计算属性
介绍:
- 避免在模板中使用冗余代码处理data中的数据
- 当依赖的data对象中的属性值发生变化时,将会触发计算方法,在data对象中生成新的变量,并且会将新的变量缓存起来;(只要依赖的data对象属性值不发生改变,将不会触发计算方法;)
- 可以用计算属性实现的,也就可以用方法methods实现,但是methods性能不如computed高;因为methods每次渲染后都会被调用,而computed只要响应式依赖(data中的属性)没有发生改变,将不会重新计算,并且计算后会重新被缓存;
- 同样,可以用计算属性实现的,也就可以用侦听器watch实现,只要所依赖的相应数据不是频繁变化,开销不大的时候,就是用计算属性,反之用监听器;
- 计算属性不需要再data中进行定义;
使用:
(1)、监听firstName和lastName计算fullName
<template>
<div>{{fullName}}</div>
</template>
<script>
export default {
data() {
return {
firstName: "wang",
lastName: "wu"
}
},
computed: {
fullName: function () { // 监听data中的firstName和lastName值的变化, 得到新变量fullName,且fullName不需要再data中定义
return this.firstName + "-" + this.lastName;
}
}
}
</script>
(2)、使用setter和getter方法
<template>
<div>firstName: {{firstName}}</div>
<div>lastName: {{lastName}}</div>
<div>{{fullName}}</div>
<a @click="changeValue">更改</a>
</template>
<script>
export default {
data() {
return {
firstName: "wang",
lastName: "wu"
}
},
computed: {
fullName: { // 监听data中的firstName和lastName, 得到新变量fullName
get: function() {
return this.firstName + "-" + this.lastName;
} ,
// set方法作用:通过参数修改计算的依赖属性firstName和lastName值
set: function(newValue) {
this.firstName = newValue[0];
this.lastName = newValue[newValue.length-1];
}
}
},
methods: {
changeValue() {
// 调用计算属性的set方法,修改firstName和lastName
this.fullName="yyyyy";
}
}
}
</script>
2、侦听器
介绍:
- 用于侦听变化较为频繁,开销较大的数据;
- 监听的变量需要在data中进行定义;
使用:
<template>
<input type="text" v-model="question" />
</template>
<script>
export default {
data() {
return {
question: "",
answer: ""
}
},
watch: {
question: function () { // 监听question值的变化, 只要question发生变化,这个函数将会被执行;
this.answer="---------------------";
this.getAnswer();
}
},
methods: function() {
getAnswer() {
console.log("question属性值发生变化了。。。");
}
}
}
</script>
https://www.yuque.com/smallwhy?tab=books