vue中的watch 和 computed 的区别

news/2025/2/22 16:52:25/

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


http://www.ppmy.cn/news/1574208.html

相关文章

探秘IP地址与MAC地址:网络世界的身份标识

在互联网的世界里&#xff0c;每台设备就像一个独特的“居民”&#xff0c;而IP地址和MAC地址则是这些“居民”的重要身份标识。它们虽然都与网络通信相关&#xff0c;但却有着明显的区别。接下来&#xff0c;让我们一起深入了解它们的奥秘。 定义与基本概念 IP地址 IP地址&…

Java-数据结构-(HashMap HashSet)

一、Tree和Hash的区别 在上一篇文章中&#xff0c;我们讲到了"TreeMap"和"TreeSet"&#xff0c;但当我们刷题的时候却会发现&#xff0c;实际应用Map和Set时&#xff0c;却常常都只会用"HashMap"和"HashSet"&#xff0c;这是为什么呢…

Linux下文件权限与安全

1.概述 1.1为什么要给文件设置权限&#xff1f; 为了防止未经授权的用户来访问你的文件&#xff0c;可以在文件和目录上设置权限。还可以设定文件 在创建时所具有的缺省权限&#xff1a;这些只是整个系统安全问题中的一小部分。本文只是简单介绍一下文件的权限与安全。 1.2文…

【GreatSQL优化器-15】index merge

【GreatSQL优化器-15】index merge 一、index merge介绍 GreatSQL的优化器的Index Merge Optimization是查询优化器在处理复杂查询时使用的一种高级技术。当查询的 WHERE 子句中有多个独立的条件&#xff0c;且每个条件都可以使用不同的索引时&#xff0c;优化器会尝试将这些…

kill -9 结束某个用户所有进程的方式-linux019

1. 使用 pkill 命令 pkill 命令可以通过用户名直接终止该用户的所有进程。加上 -9 参数&#xff0c;表示强制结束进程。 pkill -9 -u XXXX 说明&#xff1a;这个命令会使用 SIGKILL 信号&#xff08;即 kill -9&#xff09;强制终止 ttlsa 用户的所有进程。 2. 使用 killal…

【线性代数】2矩阵

1.矩阵的运算 1.1.定义 矩阵行列式数表数行数和列数可以不相等行数和列数必须相等1.2.加法与数乘 矩阵的数乘:所有元素都乘这个数 矩阵的加法:对应位置处元素相加 🦊已知,求 1.3.乘法 矩阵乘法三步法 ①能不能乘:内定乘 ②乘完是何类型:外定型 ③中的元素是什么:左…

边缘安全加速平台 EO(Edge Optimization)

腾讯云边缘安全加速平台 EO&#xff08;Edge Optimization&#xff09;是腾讯云推出的一项基于边缘计算的安全加速解决方案&#xff0c;旨在提升企业网站、应用、服务等的访问速度、安全性和稳定性。该平台结合了CDN&#xff08;内容分发网络&#xff09;、WAF&#xff08;Web应…

DuodooBMS源码解读之 cncw_ledger模块

Odoo 18 扩展模块用户使用手册 一、模块概述 本扩展模块是基于 Odoo 18 开发的&#xff0c;主要涉及账务相关的功能扩展&#xff0c;包括付款、收款、日记账报表处理、账户明细导出、对账单操作等功能。以下将详细介绍各个模块的使用方法。 二、模块功能及操作步骤 &#x…