Vue3的计算属性为了解决依赖响应式状态的复杂逻辑
基本用法
js
<script setup> import { reactive, computed } from 'vue'
const author = reactive({
name: 'John Doe',
books: [
'Vue 2 - Advanced Guide',
'Vue 3 - Basic Guide',
'Vue 4 - The Mystery'
]
})
// 一个计算属性 ref
const publishedBooksMessage = computed(() => {
return author.books.length > 0 ? 'Yes' : 'No'
})
</script>
<template>
<p>Has published books:</p> <span>{{ publishedBooksMessage }}</span>
</template>
这里定义了一个计算属性 publishedBooksMessage
。computed()
方法期望接收一个 getter 函数,返回值为一个计算属性 ref 。和其他一般的 ref 类似,你可以通过 publishedBooksMessage.value
访问计算结果。计算属性 ref 也会在模板中自动解包,因此在模板表达式中引用时无需添加 .value
。
Vue 的计算属性会自动追踪响应式依赖。它会检测到 publishedBooksMessage
依赖于 author.books
,所以当 author.books
改变时,任何依赖于 publishedBooksMessage
的绑定都会同时更新。
不同写法
要绑定一个动态类
写法一
js
const isActive = ref(true)
const error = ref(null)
const classObject = computed(() => ({
active: isActive.value && !error.value,
'text-danger': error.value && error.value.type === 'fatal'
}))
<div :class="classObject"></div>
写法二
js
const isActive = ref(true)
const error = ref(null)
const classObject = computed(() => {
return {
active: isActive.value && !error.value,
'text-danger': error.value && error.value.type === 'fatal'
}
})
<div :class="classObject"></div>
两种计算属性写法
写法一 用了对象字面量的简写形式 (省略了return
和大括号),直接返回一个对象。这是 ES6 的箭头函数语法:当函数体只有一句返回语句且为对象时,可以省略return
和外层大括号,用小括号包裹对象。
写法二 用了完整的函数体语法 ,显式写出return
语句。这种写法更适合函数体可能扩展的场景(比如未来需要添加更多逻辑,如条件判断、变量计算等)