Vue 3 中,computed 和 watch的区别

在 Vue 3 中,computed 和 watch 是两种用于处理响应式数据变化的重要工具,它们各自有不同的用途和特性。以下是它们的主要区别:

功能与用途

computed:

用途:主要用于创建基于其他响应式数据的计算属性。

实现:通过 getter 函数来返回计算后的值,并且会根据依赖的变化自动更新。

典型使用场景:

需要在模板中使用的计算属性,且这些属性依赖于多个数据源。

简化模板中的复杂表达式,提高代码的可读性和维护性。

利用缓存机制,在需要频繁读取计算结果的情况下提升性能。

watch:

用途:主要用于侦听某个数据的变化,并在数据变化时执行特定的副作用。

实现:通过一个回调函数来处理数据变化的逻辑。

典型使用场景:

需要在数据变化时执行异步操作,如 API 请求。

需要在数据变化时执行复杂逻辑或条件判断。

需要在数据变化时多次触发某个操作,但需要注意可能的性能问题。

性能表现

computed:

具有缓存特性,即只有在依赖的数据发生变化时才会重新计算,否则会直接返回缓存的结果。

因此,在需要频繁读取计算结果的情况下,computed 在性能上通常优于 watch。

watch:

会在数据变化时触发,可能会多次触发回调函数,特别是当数据频繁变化时。

如果回调函数包含复杂逻辑,可能会引起性能问题。

使用方式

computed:

在组合式 API 中,通过 computed 函数创建计算属性。

计算属性默认是只读的,但也可以定义一个可写的计算属性,允许通过 set 函数改变其值。

watch:

在组合式 API 中,通过 watch 函数创建侦听器。

可以精确指定要侦听的数据源,并在这些数据源变化时执行回调函数。

watch 返回一个停止侦听的函数,可以在需要时停止侦听。

示例对比

computed 示例:

javascript

javascript 复制代码
import { ref, computed } from 'vue';
 
const items = ref([10, 20, 30, 40]);
const total = computed(() => items.value.reduce((sum, item) => sum + item, 0));
 
console.log(total.value); // 输出: 100
watch 示例:
javascript
import { ref, watch } from 'vue';
 
const query = ref('');
 
watch(query, (newQuery, oldQuery) => {
  // 执行异步操作,如 API 请求
  fetch(`https://api.example.com/search?q=${newQuery}`)
    .then(response => response.json())
    .then(data => {
      // 更新数据
    });
});

总结

选择工具:根据实际需求选择合适的工具。如果需要侦听数据变化并执行副作用,使用 watch;如果需要计算派生状态并在模板中展示,使用 computed。

优化性能:在需要频繁读取计算结果的情况下,优先使用 computed 属性,以利用其缓存机制提升性能。

简化代码:通过使用 computed 属性,可以简化模板中的复杂表达式,提高代码的可读性和维护性。

综上所述,computed 和 watch 在 Vue 3 中各有其独特的用途和优势,开发应根据具体场景和需求选择合适的工具来优化代码性能和可读性。

相关推荐
前进前进前进11 分钟前
TRAE 全链路实战:做了一个警示牌一键生成器:纯 Canvas、单文件、零依赖
前端
小万7421 小时前
God‘s Eye View 深度解析:15 路公开信号 + CesiumJS 的浏览器级 OSINT 控制台,60 帧渲染的“真实间谍卫星模拟器”
前端
IT星宿1 小时前
浏览器标签页全是一个图标:我用名字哈希生成 favicon,让每个项目都有身份标识
前端
OpsEye1 小时前
大模型账单对账难:不同厂商 Token 统计口径差异怎么处理
javascript·ai编程
全栈项目管理程序猿1 小时前
ArcGIS JS 基础教程(32):体元系列 - VoxelSlice 体元切片
前端·javascript
拖孩4 小时前
AI 帮我写的小程序「厨菜记」上线满月了,挣了两百块!!!
前端·后端·微信小程序
用户360055579004 小时前
Kestrel_VLLM - 13 · 为什么排除 MoE FFN Tiling 与 Tensor Core
前端
流烟默4 小时前
SSE 实战:在 SpringBoot + Vue 项目中零依赖实现轻量级实时消息推送
vue.js·spring boot·后端·sse
Hilaku4 小时前
AI 流式输出都用 SSE,什么时候必须换 WebSocket?
前端·javascript·程序员
奇牙coding4 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai