vue 3 中 computed 返回只读响应式引用,惰性求值、自动缓存、响应式追踪依赖;需通过 .value 访问(script 中),模板中自动解包;不可赋值,避免副作用。

在 Vue 3 中,用 computed 定义只读计算属性非常直接:传入一个返回值的函数,它会自动追踪内部访问的响应式数据(如 ref 或 reactive 的属性),并返回一个只读的响应式引用(Ref)。
基础写法:函数式调用
这是最常用、最简洁的方式:
- 导入
computed和响应式工具(如ref) - 把计算逻辑写成箭头函数或普通函数,函数体内读取响应式变量的
.value(对ref)或属性(对reactive) - 赋值给一个变量,该变量就是只读的计算属性
示例:
import { ref, computed } from 'vue'
<p>const count = ref(5)
const doubleCount = computed(() => count.value * 2)
const message = computed(() => <code>当前数量:${count.value}</code>)</p><p>// 使用时必须加 .value(在 script 中)
console.log(doubleCount.value) // 10</p><p>// 模板中可直接使用(Vue 自动解包)
// </p><p>{{ doubleCount }}</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill1140" title="Vue"><img
src="https://img.php.cn/upload/skill/000/000/081/178797612947731.jpg" alt="Vue" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill1140" title="Vue" class="overflowclass">Vue</a>
<p class="overflowclass">避免 Vue 常见错误——响应式陷阱、ref 与 reactive 区别、计算属性时机及 Composition API 陷阱。</p>
</div>
<a rel="nofollow" href="/xiazai/skill1140" title="Vue" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
依赖响应式对象(reactive)
当数据来自 reactive 时,无需 .value,直接访问属性即可,但需确保在响应式上下文中读取(即不能解构丢失响应性):
- ✅ 正确:在
computed函数内直接访问user.name - ❌ 错误:先解构
const { name } = user再用name,会断开响应联系
示例:
import { reactive, computed } from 'vue'
<p>const user = reactive({ firstName: '李', lastName: '四' })
const fullName = computed(() => <code>${user.firstName} ${user.lastName}</code>)
</p>关键行为你得知道
只读计算属性不是普通函数,它有三个核心特点:
-
惰性求值:定义时不运行,首次访问
.value或模板中首次渲染时才执行 - 自动缓存:只要依赖没变,多次读取都返回同一结果,不重复执行函数
-
响应式追踪:Vue 静默记录你用了哪些响应式字段(比如
count.value),一旦它们变化,就标记该计算属性为“脏”,下次读取时重算
常见误区提醒
- 不要试图给只读计算属性赋值:
doubleCount.value = 100会静默失败(开发模式下可能报错) - 避免在计算属性里做副作用(如发请求、改 DOM),它只应专注“派生值”
- 如果逻辑复杂或依赖多个深层嵌套属性,考虑拆分成多个小计算属性,更易维护和复用
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









