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

vue中的watch 和 computed 的区别

1. computed(计算属性)

computed 适用于基于已有数据计算出新的数据,具有缓存特性,只有当依赖的值发生变化时才会重新计算。

特点:
  • 有缓存:如果依赖的值没有变化,多次访问 computed 只会返回之前的计算结果,不会重复执行计算逻辑,提高性能。
  • 适用于数据派生:如果某个值可以通过现有的 data 计算得出,建议使用 computed
  • 必须有返回值
例子:
<script setup>
import { ref, computed } from 'vue';

const price = ref(100);
const quantity = ref(2);

// 计算总价
const totalPrice = computed(() => {
  return price.value * quantity.value;
});
</script>

<template>
  <p>单价: {{ price }}</p>
  <p>数量: {{ quantity }}</p>
  <p>总价: {{ totalPrice }}</p>
</template>

  • totalPrice 依赖于 pricequantity,当 pricequantity 变化时,totalPrice 会自动更新。
  • 由于 computed 具有缓存特性,只有 pricequantity 发生变化时,计算逻辑才会执行。

2. watch(侦听器)

watch 适用于监听某个数据的变化并执行特定操作,但不返回值,适用于异步操作在数据变化时执行逻辑

特点:
  • 无缓存,每次监听的值变化时都会执行回调函数。
  • 适用于执行副作用操作,如请求接口、操作 DOM、本地存储等。
  • 可监听单个值或多个值,并可获取新值和旧值
例子:
<script setup>
import { ref, watch } from 'vue';

const count = ref(0);

watch(count, (newValue, oldValue) => {
  console.log(`count 从 ${oldValue} 变成了 ${newValue}`);
});
</script>

<template>
  <p>当前值: {{ count }}</p>
  <button @click="count++">增加</button>
</template>

  • count 发生变化时,watch 触发回调,输出 count 的新旧值。
  • watch 不会返回计算值,而是用于执行额外逻辑(如日志、API 调用等)。
监听多个值:
watch([price, quantity], ([newPrice, newQuantity], [oldPrice, oldQuantity]) => {
  console.log(`价格变化:${oldPrice} -> ${newPrice}`);
  console.log(`数量变化:${oldQuantity} -> ${newQuantity}`);
});


3. computed vs watch 何时使用?

对比项computedwatch
是否有返回值有,返回计算后的值无,仅执行副作用
是否有缓存有,依赖值不变时不会重新计算无,每次变化都会执行
适用于依赖已有数据计算新值监听数据变化并执行逻辑
使用场景计算属性、过滤、格式化数据监听数据变化、请求 API、执行副作用
使用建议:
  • 如果一个值是从其他值派生出来的,优先使用 computed
  • 如果需要在数据变化时执行异步请求、手动操作 DOM、存储数据等,使用 watch

4. watchEffect(更灵活的 watch

Vue 3 还提供了 watchEffect,它不需要手动指定监听的值,而是自动追踪在回调中使用的响应式数据。

import { ref, watchEffect } from 'vue';

const count = ref(0);

watchEffect(() => {
  console.log(`count 发生变化: ${count.value}`);
});

  • watchEffect 会立即执行一次,并自动追踪 count,当 count 变化时,回调会重新执行。
  • 适用于需要立即执行的副作用逻辑

总结:

  • 计算属性(computed) 用于基于已有数据派生新值,有缓存,提高性能。
  • 侦听器(watch) 用于监听数据变化并执行副作用(如 API 请求、DOM 操作等)
  • watchEffect 是更灵活的 watch,适用于自动追踪依赖项的情况。

选择哪一个取决于你的需求:如果是计算属性,优先 computed;如果是数据变化触发操作,使用 watchwatchEffect

相关文章:

  • 【spring】静态代理与动态代理 | AOP面向切面编程
  • 【论文精读】VLM-AD:通过视觉-语言模型监督实现端到端自动驾驶
  • DeepSeek破局启示录:一场算法优化对算力霸权的降维打击
  • 【机器学习】多元线性回归算法和正规方程解求解
  • LLaVA-CoT: Let Vision Language Models Reason Step-by-Step论文解读
  • Websocket——心跳检测
  • 大语言模型推理能力从何而来?
  • opencv实时二维码识别的一种实现与思路分享
  • pandas数据存到informix数据库
  • 14.5 Auto-GPT:基于Agent的AGI实验如何重新定义人工智能未来?
  • 面向机器学习的Java库与平台简介、适用场景、官方网站、社区网址
  • pyscenic运行报错:ValueError: Intersection of gene_names and tf_names is empty
  • Visual Studio 2022配置网址参考
  • 深入理解 Rust 中的智能指针
  • MKS SERVO42E57E 闭环步进电机_系列10 STM32_脉冲和串口例程
  • Quasar:轻量级、高效的.NET远程管理工具
  • 基于云的物联网系统用于实时有害藻华监测:通过MQTT和REST API无缝集成ThingsBoard
  • P2865 [USACO06NOV] Roadblocks G 与最短路的路径可重复的严格次短路
  • Javascript网页设计实例:通过JS实现上传Markdown转化为脑图并下载脑图-完整源代码,开箱即用
  • 快速入门——第三方组件element-ui
  • 摄影师|伊莎贝尔·穆尼奥斯:沿着身体进行文化溯源
  • 河南一女子被医院强制带走治疗,官方通报:当值医生停职
  • 特朗普促卡塔尔说服伊朗放弃核计划,伊朗总统:你来吓唬我们?
  • 92岁上海交大退休教师捐赠百万元给学校,其父也曾设奖学金
  • 坚持吃素,是不是就不会得高血脂了?
  • 山东:小伙为救同学耽误考试属实,启用副题安排考试