Vue3 中watch和computed

Vue 3 中 computedwatch 深度解析

在 Vue 3 组合中,响应式工具的类型安全使用至关重要。以下是详细说明

一、watch 侦听器

1. 基础类型监听
<template><div>实际参数1={{count}}</div><div><button @click="count++">点击</button></div>
</template><script setup lang="ts">
import {reactive,ref,watch
} from "vue";const count = ref<number>(0)
const state = reactive({items: [] as string[]});watch(count, (newVal:number, oldVal:number) => {state.items.push(String(count.value))console.log('newVal, oldVal === ', newVal, oldVal)
})watch(() => state.items, () => {console.log('state.items ===', state.items)
},{deep: true})</script>
2. 多源监听
<template><div>实际参数1={{count}}</div><div><button @click="count++">点击</button></div>
</template><script setup lang="ts">
import {reactive,ref,watch
} from "vue";const count = ref<number>(0)
const state = reactive({items: [] as string[]});watch(count, (newVal:number, oldVal:number) => {state.items.push(String(count.value))console.log('newVal, oldVal === ', newVal, oldVal)
})watch(() => state.items, () => {console.log('state.items ===', state.items)
},{deep: true})watch([count, state], ([newCount, newState]:[number, object], [oldCount, oldState]:[number, object])=> {console.log('[newCount, newState], [oldCount, oldState] =', newCount, newState, oldCount, oldState)
})
</script>
3. 深度监听对象
<template><div>实际参数1={{product}}</div><div><button @click="product.price++">点击</button></div>
</template><script setup lang="ts">
import {reactive,watch
} from "vue";
interface Product {id: number,price: number,name: string,specs: {color: string,weight: number}
}const product = reactive<Product>({id: 1,price: 131,name: 'Bwm',specs: {color: 'red',weight: 80}
})watch(() => product.price, // 创建新引用触发深度监听(newProduct,oldProduct) => {console.log('newVal,oldVal === ', newProduct,oldProduct)},{deep: true})
</script>

二、watchEffect 高级用法

watchEffect() 允许我们自动跟踪回调的响应式依赖,且会立即执行。

1. 基本用法
<template><div>实际参数1={{product}}</div><div><button @click="product.price++">点击</button></div>
</template><script setup lang="ts">
import {reactive,ref,watch, watchEffect
} from "vue";
interface Product {id: number,price: number,name: string,specs: {color: string,weight: number}
}const product = reactive<Product>({id: 1,price: 131,name: 'Bwm',specs: {color: 'red',weight: 80}
})
const totalPrice = ref<number>(0)watchEffect(()=> {totalPrice.value = product.price + 2console.log('totalPrice === ', totalPrice)
})
</script>
2. 清理副作用
<template><div>实际参数1={{product}}</div><div><button @click="product.price+=10">点击</button></div>
</template><script setup lang="ts">
import {reactive,ref,watchEffect,onWatcherCleanup
} from "vue";interface Product {id: number,price: number,name: string,specs: {color: string,weight: number}
}const product = reactive<Product>({id: 1,price: 131,name: 'Bwm',specs: {color: 'red',weight: 80}
})
const totalPrice = ref<number>(0)watchEffect(()=> {totalPrice.value = product.price + 2console.log('totalPrice === ', totalPrice)onWatcherCleanup(() => {console.log('onWatcherCleanup ===')})
})
</script>

三、computed 计算属性

1. 对象类型计算
<template><div>实际参数1={{totalPrice}}</div><div><button @click="product.price+=10">点击</button></div>
</template><script setup lang="ts">
import {reactive,ref,computed
} from "vue";
interface Product {id: number,price: number,name: string,specs: {color: string,weight: number}
}const product = reactive<Product>({id: 1,price: 131,name: 'Bwm',specs: {color: 'red',weight: 80}
})
const totalPrice = computed<number>(()=>product.price += 10)
</script>
2. 可写计算属性
<template><div>{{fullName}}</div><div>姓名: <el-input v-model="fullName"/></div>
</template><script setup lang="ts">
import {reactive,ref,computed
} from "vue";
const firstName = ref<string>('Jane')
const lastName = ref<string>('Smith')const fullName = computed<string>({get() {return `${firstName.value} ${lastName.value}`},set(fullName:string) {const [newFirstName, newLastName] = fullName.split(' ')firstName.value = newFirstNamelastName.value = newLastName}
})
</script>

四、computed vs watch vs watchEffect 对比

特性computedwatchwatchEffect
目的派生值响应变化执行操作自动追踪依赖执行操作
返回值ref对象停止函数停止函数
初始化执行立即计算可配置(immediate)立即执行
依赖声明自动显式指定自动
缓存
异步支持
清理机制
调试钩子
适合场景数据转换/格式化精确控制的操作自动追踪依赖的副作用

总结

  1. computed

    • 用于派生状态
    • 具有缓存机制
    • 适合数据转换和格式化
    • 模板中优先使用
  2. watch

    • 用于执行副作用
    • 提供精确控制
    • 适合异步操作、DOM操作
    • 需要显式声明依赖
  3. watchEffect

    • 自动追踪依赖
    • 立即执行
    • 适合多个依赖的简单副作用
    • 提供清理机制

黄金法则

  • 需要派生值 → 用 computed
  • 需要响应变化执行操作 → 用 watchwatchEffect
  • 需要精确控制依赖 → 用 watch
  • 需要自动追踪多个依赖 → 用 watchEffect
  • 避免computed 中产生副作用
  • 总是在副作用中清理资源

通过合理选择和使用这些 API,可以构建出高效、可维护的 Vue 3 应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912781.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET测试工具Parasoft dotTEST:全兼容RMS的测试解决方案

随着项目规模扩大&#xff0c;需求管理变得复杂&#xff0c;如何高效追溯需求与测试的关联性成为一大挑战。Parasoft dotTEST 提供了一套强大的需求追溯解决方案&#xff0c;不仅能自动关联单元测试结果与需求&#xff0c;还能兼容几乎所有需求管理系统&#xff08;RMS&#xf…

基于Jeecgboot3.8.1的vue3版本前后端分离的flowable流程管理平台

初步迁移完成了基于jeecgboot3.8.1的vue3版本的前后端流程管理平台,基于flowable6.8.0,同时支持bpmn流程设计器与仿钉钉流程设计器。 功能类似于3.6.3,但增加了一些以下功能: 1、支持多租户 2、支持并行网关的任意跳转、退回与驳回 3、流程表达式 这里流程表达式定义四…

IP 限流 vs. URI 限流

背景&#xff1a; 昨天调程序的时候遇到了一个 BUG&#xff0c;前端无法将文件正确传给后端&#xff0c;后端报错 EOFException&#xff08;EOF 代表 End Of File&#xff09;就是在程序尝试从一个数据流中读取数据时&#xff0c;发现已经到达了数据流的末尾&#xff0c;但它却…

2025年Java常见面试题(持续更新)

数据库事务特性。原子性、一致性、隔离性、持久性如何防止SQL注入&#xff1a;使用#不要使用$符号&#xff1b;对所有的入参做校验&#xff1b;使用存储过程&#xff1b;执行预处理语句和参数化查询&#xff1b;最低权限原则&#xff1b;微服务拆分的原则&#xff1a;微服务的拆…

Spring AI ——在springboot应用中实现基本聊天功能(ChatModel)

文章目录 前言项目版本依赖引入配置key信息编写测试接口注入ChatModel并普通返回注入ChatModel并流式返回自定义模型对象并直接返回总结前言 在Spring AI 中,CchatClient 是一个所有大模型通用性的调用方式,对绝大多数大模型的功能点都具备封装和见解调用性。 但这一点在部…

78、系统工程生命周期阶段及方法

一、系统工程生命周期的七大阶段 系统工程生命周期涵盖从概念萌芽到系统退役的全过程&#xff0c;通常分为以下七个阶段&#xff0c;每个阶段具有明确目标与核心任务&#xff1a; 1.探索性研究阶段 目标&#xff1a;识别利益相关者需求&#xff0c;探索技术可行性。任务&…

二十九、【用户体验篇】个人中心:用户资料展示与密码修改

二十九、【用户体验篇】个人中心:用户资料展示与密码修改 前言准备工作第一部分:后端实现 - 个人中心 API1. 修改 `UserDetailSerializer` 以支持密码修改2. 在 `api/views.py` 中添加 `UserMeView` 和 `PasswordChangeView`3. 注册个人中心相关 API 路由4. 后端初步测试第二…

STEP-BACK PROMPTING:退一步:通过抽象在大型语言模型中唤起推理能力

摘要 我们提出了 STEP-BACK PROMPTING&#xff0c;这是一种简单的提示技术&#xff0c;可以让LLM进行抽象&#xff0c;从包含具体细节的实例中推导出高层次概念和第一性原理。利用这些概念和原理来引导推理过程&#xff0c;LLM在朝向正确解答路径上显著提升了推理能力。我们在…

Paimon vs. HBase:全链路开销对比

Paimon 在特定场景&#xff08;如流式 Lookup Join&#xff09;下&#xff0c;会为了极致的查询性能而引入额外的存储&#xff08;本地磁盘 LookupFile&#xff09;和计算&#xff08;构建 LookupFile&#xff09;开销。但这是一种用一次性的、可控的开销&#xff0c;换取后续持…

本地的包名导致的AttributeError: module ‘langchain‘ has no attribute ‘verbose‘

你遇到的 AttributeError: module langchain has no attribute verbose 问题&#xff0c;确实可能是因为你的本地文件或目录名与 langchain 官方包冲突&#xff0c;导致 Python 在导入时优先加载了你的本地文件而非真正的 langchain 库。 问题原因 Python 模块加载机制&#xf…

玄机——某学校系统中挖矿病毒应急排查

本篇文章主要记录某学校长期未运营维护的程序&#xff0c;被黑客发现了漏洞&#xff0c;但好在学校有全流量设备&#xff0c;抓取到了过程中的流量包 需要你进行上机以及结合流量分析&#xff0c;排查攻击者利用的漏洞以及上传利用成功的木马 文章目录 靶机介绍1.使用工具分析共…

如何解决wordpress批量删除媒体库中的图片很慢甚至卡死问题

批量删除WordPress媒体库中的图片速度很慢&#xff0c;如果批量删除的图片多会出现CPU100%甚至卡死&#xff0c;出现这个问题通常最主要的原因是服务器性能问题&#xff0c;如果换成性能好的服务器就不会了&#xff0c;比如换Siteground 家的服务器&#xff0c;就不会有这个问题…

深度学习入门day4--手写数字识别初探

鱼书提供的代码可以在github找到。源码地址 环境配置部分可以看前面几篇博客&#xff0c;还是用Anaconda&#xff0c;运行下面代码&#xff0c;可以看哪个库缺失。 import importlib import numpy as np deps {"torch": "torch","torchvision"…

STM32中定时器配置,HAL_Delay的原理,滴答定时器,微秒延时实现,PWM,呼吸灯

目录 定时器基本定时功能实现 CubeMX设置 手动书写代码部分 定时器启动 实现溢出回调函数 HAL_Delay介绍 HAL_Delay实现原理 HAL_Delay的优点 HAL_Delay的缺点 利用滴答定时器(SysTick)实现微秒级延时 PWM PWM介绍 通用定时器中的重要寄存器 PWM中的捕获比较通道 …

飞牛NAS(fnOS)详细安装教程

以下是飞牛NAS&#xff08;fnOS&#xff09;的详细安装教程&#xff0c;结合官方指南和社区实践整理而成&#xff1a; 一、准备工作 硬件需求 8GB或更大容量的U盘&#xff08;用于制作启动盘&#xff09;待安装设备&#xff08;支持x86架构的物理机或迷你主机&#xff0c;如天钡…

springboot 显示打印加载bean耗时工具类

一 spring的原生接口说明 1.1 接口说明 Aware是Spring框架提供的一组特殊接口&#xff0c;可以让Bean从Spring容器中拿到一些资源信息。 BeanFactoryAware&#xff1a;实现该接口&#xff0c;可以访问BeanFactory对象&#xff0c;从而获取Bean在容器中的相关信息。 Environm…

OpenGL空间站场景实现方案

OpenGL空间站场景实现方案 需求分析 根据任务要求,我需要完成一个基于Nehe OpenGL的空间站场景,实现以下功能: 完整的空间站场景建模(包含多个模型和纹理贴图)Phong光照模型实现(包含多种光源和材质效果)摄像机键盘控制交互功能解决方案设计 技术栈 C++编程语言OpenG…

基于昇腾310B4的YOLOv8目标检测推理

YOLOv8目标检测 om 模型推理 本篇博客将手把手教你如何将 YOLOv8 目标检测模型部署到华为昇腾 310B4 开发板上进行高效推理&#xff08;其他昇腾开发版也可参考此流程&#xff09;。 整个流程包括&#xff1a; 模型格式转换&#xff08;ONNX → OM&#xff09;昇腾推理环境配…

前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy

在前端开发中&#xff0c;跨域资源共享&#xff08;CORS&#xff09;是一个常见的问题。它涉及到浏览器安全机制&#xff0c;防止网页从一个域获取资源时被另一个域阻止。错误信息如“Access to XMLHttpRequest at xxx from origin has been blocked by CORS policy”是典型的跨…

[ linux-系统 ] 软硬链接与动静态库

软硬链接 介绍 软链接 通过下图可以看出软链接和原始文件是两个独立的文件&#xff0c;因为软链接有着自己的inode编号&#xff1a; 具有独立的 inode &#xff0c;也有独立的数据块&#xff0c;它的数据块里面保存的是指向的文件的路径&#xff0c;公用 inode 硬链接 通过…