【vue高频面试题】第 15 题:computed vs watch 区别 + 使用场景

第 15 题:computed vs watch 区别 + 使用场景


🎯 一、标准回答(面试官必答点)

特性 computed watch
依赖收集 自动依赖追踪 需要手动指定依赖
返回值 会缓存(lazy evaluation) 不缓存
用途 计算衍生数据 执行副作用(API、DOM操作等)
执行时机 访问时才执行 数据变化时触发
获取 oldValue ✔ 可以获取
适用场景 纯计算逻辑 监听变化做异步或副作用处理

🎯 二、代码示例

1️⃣ computed 示例(缓存计算)

xml 复制代码
<script setup>
import { ref, computed } from 'vue'

const count = ref(1)
const double = computed(() => count.value * 2)

console.log(double.value) // 2

count.value++
console.log(double.value) // 4,computed 会自动更新并缓存
</script>

特点:

  • 只有访问 double.value 时才执行
  • 如果依赖未变化,直接返回缓存值

2️⃣ watch 示例(副作用监听)

xml 复制代码
<script setup>
import { ref, watch } from 'vue'

const count = ref(1)

watch(count, (newVal, oldVal) => {
  console.log(`count changed from ${oldVal} to ${newVal}`)
})
count.value++  // 触发 watch 回调

特点:

  • 触发副作用(日志、请求 API、操作 DOM)
  • 可以获取 oldVal
  • 默认 flush: 'pre'(可指定 post 或 sync)

🎯 三、面试官追问(高频)


追问 1:computed 能做异步吗?

  • computed 不支持异步(只计算同步逻辑)
  • 异步逻辑应该用 watchwatchEffect

追问 2:computed 的懒执行原理?

  • 内部依赖收集 + dirty flag
  • 依赖变化时标记 dirty = true
  • 下次访问 value 时才重新计算并缓存结果

追问 3:computed vs watchEffect 区别?

特性 computed watchEffect
返回值 缓存返回值 无返回值
依赖 自动收集 自动收集
执行时机 访问 value 时才执行 默认立即执行一次
用途 衍生数据 副作用逻辑

追问 4:watch 可以替代 computed 吗?

  • 技术上可以,但不推荐
  • watch 不缓存,每次访问都可能重新执行
  • computed 更轻量且性能高

追问 5:computed 可以和 ref 联动吗?

scss 复制代码
const count = ref(1)
const double = computed(() => count.value * 2)
double.value++ // ❌ 报错,computed 默认只读
  • 解决方法 :使用 computed({ get, set }) 创建可写 computed
dart 复制代码
const double = computed({
  get: () => count.value * 2,
  set: val => count.value = val / 2
})

🎯 四、一句话总结(背面试官即可)

computed 用于缓存衍生数据,懒执行、自动依赖收集;watch 用于监听数据变化触发副作用,可获取新旧值。computed 更轻量,watch 更灵活,适合异步或副作用逻辑。

相关推荐
前端一课1 小时前
【vue高频面试题】第 20 题:Vue3 生命周期 + watch 执行顺序
前端·面试
前端一课1 小时前
【vue高频面试题】第 16 题:Vue3 响应式原理深度解析(Proxy + effect 栈 + 依赖追踪)
前端·面试
执笔论英雄1 小时前
【大模型推理】小白教程:vllm 异步接口
前端·数据库·python
炒毛豆1 小时前
vue3+ant design vue实现表单验证失败后,自动滚动到失败的位置(scrollToField)
前端·javascript·vue.js
IT_陈寒1 小时前
Vite 5个隐藏功能大揭秘:90%的开发者都不知道这些提速技巧!
前端·人工智能·后端
得贤招聘官1 小时前
第六代AI面试智能体:重塑招聘流程的高效解决方案
人工智能·面试·职场和发展
fruge1 小时前
Vue3 实战避坑:10 个 Composition API 高频错误及修复方案
前端·javascript·vue.js
努力学算法的蒟蒻1 小时前
day21(12.1)——leetcode面试经典150
面试