当前位置: 首页 > news >正文

Vue 3 核心进阶:深度解析计算属性 (Computed)

在 Vue 3 的 Composition API 中,computed 是最常用且最强大的响应式工具之一。它不仅能简化模板逻辑,还能通过缓存机制极大地优化应用性能。

一、 什么是计算属性?

计算属性(Computed Properties)本质上是一个响应式的派生值。它可以基于一个或多个响应式引用(refreactive)进行计算,并返回一个新的只读或可读写的响应式对象。

核心特性:

  1. 声明式逻辑:将复杂的逻辑从模板(Template)中抽离。
  2. 响应式依赖追踪:Vue 会自动追踪计算属性用到了哪些响应式数据。
  3. 缓存(Caching):这是它与普通函数最大的区别。计算属性会基于它们的响应式依赖进行缓存。只有在相关依赖发生改变时它们才会重新求值。

二、 基础用法:只读计算属性

<script setup> 中,我们从 vue 包中导入 computed 函数。最常见的用法是传入一个 getter 函数。

<script setup>
import { ref, computed } from 'vue'const count = ref(0)
const price = ref(100)// 创建一个计算属性:总价
// 只有当 count 或 price 改变时,totalPrice 才会重新计算
const totalPrice = computed(() => {console.log('计算中...') // 测试缓存:多次访问模板,此行只打印一次return count.value * price.value
})const increment = () => count.value++
</script><template><div><p>单价: {{ price }} | 数量: {{ count }}</p><p>总价 (计算属性): {{ totalPrice }}</p><button @click="increment">增加数量</button></div>
</template>

三、 进阶用法:可写计算属性 (Getter & Setter)

虽然计算属性默认是只读的,但在某些场景(如:双向绑定 V-Model)下,你可能需要修改它。这时可以传入一个带有 getset 函数的对象。

import { ref, computed } from 'vue'const firstName = ref('John')
const lastName = ref('Doe')const fullName = computed({// getterget() {return `${firstName.value} ${lastName.value}`},// setterset(newValue) {// 注意:newValue 是你尝试赋给 fullName 的新值const names = newValue.split(' ')firstName.value = names[0]lastName.value = names[names.length - 1]}
})// 使用示例:
// fullName.value = 'Steve Rogers' 
// 此时会触发 set,进而自动更新 firstName 和 lastName

四、 计算属性 vs 监听器 vs 函数

这是面试和博客中经常讨论的话题。

特性 计算属性 (Computed) 监听器 (Watch) 普通函数 (Methods)
目的 派生出新状态(1变N/N变1) 执行副作用(如 API 请求、DOM 操作) 响应事件或处理临时逻辑
缓存
返回值 必须有返回值 通常没有返回值 视情况而定
懒执行 依赖不变不执行 默认立即执行或改变时执行 每次调用都执行

五、 最佳实践与注意事项

在撰写博客时,强调以下几点会显得你更专业:

1. 避免副作用

计算属性的 getter 应该只做纯计算。不要在计算属性中修改 DOM、发起异步请求或修改其他的响应式状态。如果有这些需求,请使用 watch

2. 不要直接修改计算属性的返回值

除非你定义了 set,否则计算属性应该是“只读”的快照。应该修改它依赖的源数据来触发更新。

3. 性能优化

如果一个复杂的计算逻辑在页面中被多次引用,请务必使用计算属性而不是函数。缓存机制能避免重复的 CPU 消耗。


六、 实战案例:列表搜索过滤

这是一个非常适合放在博客里的 Demo,展示了 computed 如何简化逻辑:

<script setup>
import { ref, computed } from 'vue'const searchText = ref('')
const users = ref([{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Charlie' }
])// 过滤后的列表:自动随输入内容变化
const filteredUsers = computed(() => {return users.value.filter(user => user.name.toLowerCase().includes(searchText.value.toLowerCase()))
})
</script><template><input v-model="searchText" placeholder="搜索用户..." /><ul><li v-for="user in filteredUsers" :key="user.id">{{ user.name }}</li></ul>
</template>
http://www.jsqmd.com/news/189592/

相关文章:

  • 电池回收溯源管理:HunyuanOCR识别废旧动力电池编码
  • 竖排中文文本识别:HunyuanOCR对传统文献的支持情况
  • 火山引擎AI大模型VS腾讯混元OCR:谁更适合中文场景?
  • 电影预告片物料生产:后期团队用lora-scripts快速生成概念海报
  • 跨境电商需求旺盛:HunyuanOCR多语言能力助力全球化业务
  • Arduino Uno作品接入BMP180气压传感器的核心要点
  • 快递最后一公里配送:HunyuanOCR帮助识别单元门禁编号
  • 教材教辅资料识别:HunyuanOCR为在线教育平台提供素材
  • 光照不均影响评估:强光/阴影条件下识别结果分析
  • 图解说明USB Burning Tool刷机工具刷机前准备步骤
  • 树莓派5引脚定义在传感器控制中的应用解析
  • 白板讨论内容捕捉:HunyuanOCR助力头脑风暴成果留存
  • OrCAD电路图绘制实战案例:从零实现完整项目
  • 无源蜂鸣器PWM调音技术:Arduino实战案例
  • 电影院排片表OCR:HunyuanOCR抓取放映时间构建聚合购票平台
  • 物业缴费通知单识别:HunyuanOCR实现自动提醒功能
  • 基于esptool的智能灯控系统配置实战案例
  • 树莓派烧录:从零理解SD卡启动机制
  • 考试试卷扫描阅卷:HunyuanOCR提取客观题答案进行评分
  • 网盘直链下载助手配合HunyuanOCR:实现远程文件智能解析
  • eSPI协议帧结构解析:完整指南起始与终止条件
  • HunyuanOCR实战教程:使用Jupyter启动界面推理与API接口
  • 前端开发者必看:用JavaScript对接HunyuanOCR API实现网页OCR
  • 火山引擎AI大模型联动HunyuanOCR:探索企业级文档处理新范式
  • 一文说清ESP32开发中Arduino IDE的核心调试技巧
  • HTML Canvas图像压缩后再传给HunyuanOCR减少带宽消耗
  • 消费级显卡也能跑LoRA训练?lora-scripts低资源适配实测
  • circuit simulator与传统实验结合的教学模式:全面讲解
  • Arduino Uno集成雨滴传感器的操作指南
  • 建筑图纸标注识别可行吗?HunyuanOCR在CAD场景下的尝试