最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3使用watch監(jiān)聽響應(yīng)式數(shù)據(jù)變化的方法詳解

 更新時(shí)間:2026年02月11日 08:57:54   作者:Mr?Xu_  
在?Vue?3?的組合式?API(Composition?API)中,watch?是一個(gè)非常核心且強(qiáng)大的工具,用于監(jiān)聽響應(yīng)式數(shù)據(jù)的變化并執(zhí)行相應(yīng)的副作用操作,本文將結(jié)合實(shí)際代碼示例,深入講解?watch?的使用方法、參數(shù)配置、常見寫法及其應(yīng)用場景,需要的朋友可以參考下

引言

在 Vue 3 的組合式 API(Composition API)中,watch 是一個(gè)非常核心且強(qiáng)大的工具,用于監(jiān)聽響應(yīng)式數(shù)據(jù)的變化并執(zhí)行相應(yīng)的副作用操作。本文將結(jié)合實(shí)際代碼示例,深入講解 watch 的使用方法、參數(shù)配置(如 deepimmediate)、常見寫法及其應(yīng)用場景。

一、watch 基本用法

Vue 3 中的 watch 函數(shù)用于監(jiān)聽響應(yīng)式引用(ref)、響應(yīng)式對(duì)象(reactive)或計(jì)算屬性(computed)的變化。其基本語法如下:

import { watch } from 'vue'
 
watch(source, callback, options?)
  • source:要監(jiān)聽的數(shù)據(jù)源,可以是 ref、reactive 對(duì)象、getter 函數(shù),或由多個(gè)上述組成的數(shù)組。
  • callback:當(dāng)監(jiān)聽的數(shù)據(jù)發(fā)生變化時(shí)觸發(fā)的回調(diào)函數(shù),接收新值和舊值作為參數(shù)。
  • options(可選):配置選項(xiàng),如 { deep: true, immediate: true }。

二、常見寫法與示例分析

1. 監(jiān)聽 ref 或 reactive 對(duì)象

const count = ref(0)
 
watch(count, (newVal, oldVal) => {
  console.log(`count 從 ${oldVal} 變?yōu)?${newVal}`)
})

對(duì)于 reactive 對(duì)象,若只監(jiān)聽整個(gè)對(duì)象(而非深層屬性),默認(rèn)不會(huì)觸發(fā)深層監(jiān)聽:

const user = reactive({ name: 'Alice', age: 25 })
 
// ? 這樣不會(huì)監(jiān)聽到 user.name 的變化!
watch(user, (newVal, oldVal) => {
  // 不會(huì)觸發(fā)
})

此時(shí)需要開啟 deep: true(見下文)。

2. 使用 getter 函數(shù)監(jiān)聽特定屬性(推薦方式)

這是最靈活、最常用的方式,尤其適用于監(jiān)聽 props、route 等非直接 ref 的數(shù)據(jù)。

示例 1:監(jiān)聽 props 中的復(fù)雜對(duì)象(如數(shù)組)

watch(
  () => props.fileList,
  (newFiles, oldFiles) => handleFiles(newFiles, oldFiles),
  { deep: true }
)
  • () => props.fileList:返回一個(gè) getter 函數(shù),確保能正確追蹤依賴。
  • deep: true:因?yàn)?fileList 很可能是數(shù)組或?qū)ο?,?nèi)部元素變化不會(huì)觸發(fā)淺層監(jiān)聽,必須開啟深度監(jiān)聽。
  • 回調(diào)函數(shù)接收新舊值,便于做差異處理(如上傳文件列表變更)。

注意:如果 fileList 是一個(gè)數(shù)組,即使你 push 一個(gè)新文件,淺層監(jiān)聽也不會(huì)觸發(fā),因?yàn)閿?shù)組引用未變。deep: true 能解決這個(gè)問題。

示例 2:監(jiān)聽路由路徑變化

watch(
  () => route.path,
  (newPath) => {
    activeMenu.value = newPath
  }
)
  • route 來自 vue-routeruseRoute(),是一個(gè)響應(yīng)式對(duì)象。
  • 監(jiān)聽 route.path 可以在用戶切換頁面時(shí)自動(dòng)更新高亮菜單項(xiàng)。
  • 此處無需 deep,因?yàn)?path 是字符串(原始值),變化即觸發(fā)。

三、關(guān)鍵配置選項(xiàng)詳解

1.deep: true—— 深度監(jiān)聽

  • 作用:監(jiān)聽對(duì)象或數(shù)組內(nèi)部屬性的變化。
  • 適用場景:監(jiān)聽嵌套對(duì)象、數(shù)組、props 中的復(fù)雜結(jié)構(gòu)。
  • 注意:性能開銷較大,僅在必要時(shí)使用。
const form = reactive({
  user: { name: '', email: '' }
})
 
watch(form, (newVal) => {
  // 默認(rèn)不觸發(fā)
}, { deep: true }) // 開啟后,user.name 變化也會(huì)觸發(fā)

對(duì)于 ref 包裹的對(duì)象,watch(refObj, ..., { deep: true }) 也能深度監(jiān)聽。

2.immediate: true—— 立即執(zhí)行

  • 作用:在偵聽 器創(chuàng)建時(shí)立即執(zhí)行一次回調(diào)。
  • 適用場景:初始化時(shí)就需要根據(jù)當(dāng)前值執(zhí)行邏輯(如根據(jù)路由加載數(shù)據(jù))。
watch(
  () => route.query.id,
  (id) => {
    if (id) fetchDetail(id)
  },
  { immediate: true }
)

如果不加 immediate: true,首次進(jìn)入頁面時(shí) id 存在但不會(huì)觸發(fā) fetchDetail。

3. 同時(shí)監(jiān)聽多個(gè)源

watch([refA, refB], ([newA, newB], [oldA, oldB]) => {
  console.log('A or B changed')
})

四、watch vs watchEffect

特性watchwatchEffect
是否需要指定依賴? 需要顯式指定? 自動(dòng)追蹤
能否訪問舊值? 可以? 不能
是否立即執(zhí)行默認(rèn)否(可用 immediate 控制)? 總是立即執(zhí)行
適用場景需要對(duì)比新舊值、精確控制依賴初始化 + 自動(dòng)依賴追蹤

通常建議優(yōu)先使用 watch,因?yàn)樗鞔_、可控。

五、最佳實(shí)踐建議

  1. 監(jiān)聽 props 時(shí),始終使用 getter 寫法() => props.xxx
  2. 對(duì)對(duì)象/數(shù)組變化,記得加 deep: true
  3. 需要初始化執(zhí)行?加 immediate: true
  4. 避免在 watch 中修改被監(jiān)聽的值,可能引發(fā)無限循環(huán)
  5. 及時(shí)清理副作用(如取消請(qǐng)求),可在回調(diào)中返回清理函數(shù)(類似 useEffect)
watch(someRef, async (id) => {
  const cancelToken = axios.CancelToken.source()
  try {
    await axios.get(`/api/data/${id}`, { cancelToken: cancelToken.token })
  } catch (e) {
    if (!axios.isCancel(e)) throw e
  }
  // 返回清理函數(shù)
  return () => cancelToken.cancel()
})

六、總結(jié)

watch 是 Vue 3 組合式 API 中處理副作用和響應(yīng)式數(shù)據(jù)聯(lián)動(dòng)的核心工具。通過合理使用 deep、immediate 等選項(xiàng),我們可以精準(zhǔn)控制監(jiān)聽行為,提升應(yīng)用的響應(yīng)性和用戶體驗(yàn)。

以上就是Vue3使用watch監(jiān)聽響應(yīng)式數(shù)據(jù)變化的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue3 watch監(jiān)聽響應(yīng)式數(shù)據(jù)變化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue引入ueditor及node后臺(tái)配置詳解

    vue引入ueditor及node后臺(tái)配置詳解

    這篇文章主要介紹了vue引入ueditor及node后臺(tái)配置詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • vue通過滾動(dòng)行為實(shí)現(xiàn)從列表到詳情,返回列表原位置的方法

    vue通過滾動(dòng)行為實(shí)現(xiàn)從列表到詳情,返回列表原位置的方法

    今天小編就為大家分享一篇vue通過滾動(dòng)行為實(shí)現(xiàn)從列表到詳情,返回列表原位置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • vue項(xiàng)目如何刪除無用的依賴詳解

    vue項(xiàng)目如何刪除無用的依賴詳解

    vue是目前非常流行的前端開發(fā)框架,隨著技術(shù)的不斷更新,我們也需要更新我們的vue項(xiàng)目,這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目如何刪除無用的依賴的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • 如何在在Vue3中使用markdown 編輯器組件

    如何在在Vue3中使用markdown 編輯器組件

    vue3發(fā)布正式版不久,生態(tài)還沒完全發(fā)展起來,目前支持vue3的開源markdown編輯器組件基本上也寥寥無幾,向大家推薦一個(gè)很好用的v-md-editor 組件,組件功能很強(qiáng)大,文檔也比較詳細(xì)。該文章只介紹組件的常用功能,更多高級(jí)的功能可以參考官方文檔。
    2021-05-05
  • el-input寬度跟隨輸入內(nèi)容自適應(yīng)的實(shí)現(xiàn)方法

    el-input寬度跟隨輸入內(nèi)容自適應(yīng)的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于el-input寬度跟隨輸入內(nèi)容自適應(yīng)的實(shí)現(xiàn)方法,我們?cè)賹?shí)際應(yīng)用中可能需要input文本框能夠根據(jù)輸入字符的所占據(jù)的寬度自動(dòng)調(diào)節(jié)尺寸,需要的朋友可以參考下
    2023-08-08
  • Vue2 模板template的四種寫法總結(jié)

    Vue2 模板template的四種寫法總結(jié)

    下面小編就為大家分享一篇Vue2 模板template的四種寫法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 使用vue實(shí)現(xiàn)加載頁

    使用vue實(shí)現(xiàn)加載頁

    這篇文章主要為大家詳細(xì)介紹了使用vue實(shí)現(xiàn)加載頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • vue中jsencrypt與base64加密解密的實(shí)用流程

    vue中jsencrypt與base64加密解密的實(shí)用流程

    vue項(xiàng)目里面使用到的加密和解密的方法,本文主要介紹了vue中jsencrypt與base64加密解密的實(shí)用流程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • vue中input獲取光標(biāo)位置并追加內(nèi)容

    vue中input獲取光標(biāo)位置并追加內(nèi)容

    這篇文章主要給大家介紹了關(guān)于vue中input獲取光標(biāo)位置并追加內(nèi)容的相關(guān)資料,vue通過當(dāng)前的光標(biāo)來進(jìn)行插值,從而需要去獲取光標(biāo)所在的位置,需要的朋友可以參考下
    2023-07-07
  • django+vue項(xiàng)目搭建實(shí)現(xiàn)前后端通信

    django+vue項(xiàng)目搭建實(shí)現(xiàn)前后端通信

    本文主要介紹了django+vue項(xiàng)目搭建實(shí)現(xiàn)前后端通信,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評(píng)論

泽州县| 罗城| 玉环县| 抚远县| 舞钢市| 潮安县| 灌阳县| 万年县| 吉水县| 临湘市| 寿光市| 武义县| 资溪县| 原平市| 富宁县| 萍乡市| 新巴尔虎右旗| 九江市| 秀山| 当涂县| 手游| 岫岩| 龙游县| 广汉市| 大同县| 崇州市| 永定县| 隆安县| 高州市| 都安| 邢台市| 中牟县| 南木林县| 盐源县| 密云县| 凤凰县| 嘉禾县| 平武县| 凭祥市| 桃源县| 衢州市|