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
英文地址,請注明出處:http://en.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 硬鏈接 通過…