vue2 和 vue3 中 computer 计算属性的用法
Vue 2 中的 computed
在 Vue 2 中,计算属性是响应式的,并且基于 getter 进行缓存,只有依赖的响应式数据发生变化时才会重新计算。
基本用法
<template>
<div>
<p>原始消息:{{ message }}</p>
<p>反转消息:{{ reversedMessage }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: "Hello Vue!"
};
},
computed: {
// 计算属性
reversedMessage() {
return this.message.split("").reverse().join("");
}
}
};
</script>
特点:
- 计算属性
reversedMessage依赖于message,当message发生变化时,它会自动重新计算。 computed具有缓存功能,只有在依赖的属性变更时才会重新计算,而不像methods每次调用都会执行。
计算属性的 Getter 和 Setter
计算属性默认只有 getter,但也可以定义 setter。
<script>
export default {
data() {
return {
firstName: "John",
lastName: "Doe"
};
},
computed: {
fullName: {
get() {
return this.firstName + " " + this.lastName;
},
set(newValue) {
const names = newValue.split(" ");
this.firstName = names[0];
this.lastName = names[1] || "";
}
}
}
};
</script>
特点:
- 当读取
fullName时,会调用getter返回拼接后的字符串。 - 当修改
fullName时(例如this.fullName = "Alice Smith"),会触发setter并更新firstName和lastName。
Vue 3 中的 computed
在 Vue 3 中,除了 Options API 仍然可以使用 computed,Composition API 也提供了新的 computed 方法(从 vue 导入)。
Vue 3 Options API 用法(与 Vue 2 相同)
Vue 3 仍然支持 Vue 2 的 computed 写法:
<script>
export default {
data() {
return {
message: "Hello Vue 3!"
};
},
computed: {
reversedMessage() {
return this.message.split("").reverse().join("");
}
}
};
</script>
Vue 3 Composition API 用法
Vue 3 允许使用 computed 来创建计算属性,而不是定义在 computed 选项中。
基本用法
<template>
<div>
<p>原始消息:{{ message }}</p>
<p>反转消息:{{ reversedMessage }}</p>
</div>
</template>
<script>
import { ref, computed } from "vue";
export default {
setup() {
const message = ref("Hello Vue 3!");
const reversedMessage = computed(() => {
return message.value.split("").reverse().join("");
});
return { message, reversedMessage };
}
};
</script>
特点:
message使用ref进行响应式声明。computed(() => {})用于创建计算属性,返回的值是一个ref,必须用.value访问其内部值。
计算属性的 Getter 和 Setter
Vue 3 的 computed 也支持 getter 和 setter,类似于 Vue 2:
<script>
import { ref, computed } from "vue";
export default {
setup() {
const firstName = ref("John");
const lastName = ref("Doe");
const fullName = computed({
get: () => `${firstName.value} ${lastName.value}`,
set: (newValue) => {
const names = newValue.split(" ");
firstName.value = names[0];
lastName.value = names[1] || "";
}
});
return { firstName, lastName, fullName };
}
};
</script>
特点:
computed传入对象,定义get和set方法。set方法允许修改computed值,并影响ref定义的firstName和lastName。
Vue 2 vs Vue 3 computed 对比
| 特性 | Vue 2 | Vue 3 |
|---|---|---|
| 语法 | computed: { ... } | computed(() => {}) |
| 依赖响应式 | this.data | ref() 或 reactive() |
| Getter/Setter | computed: { get() {}, set() {} } | computed({ get() {}, set() {} }) |
需要 this | 需要 this | 无需 this |
| Composition API | ❌ | ✅ |
总结
- Vue 2 的
computed定义在computed选项中,必须依赖this访问data。 - Vue 3
Options API仍然支持 Vue 2 语法,但 Vue 3 主要推荐使用 Composition API。 - Vue 3
Composition API提供computed方法,使用ref或reactive作为依赖,不需要this,更灵活可组合。 - 计算属性支持
getter和setter,可以用来双向绑定数据。
Vue 3 的 Composition API 让 computed 变得更简洁、模块化,特别适用于组合逻辑复杂的应用场景。
