欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你掌握vue3中偵聽器的使用

 更新時間:2023年09月05日 14:30:55   作者:哄哄  
偵聽器和計算屬性都可以用于偵聽響應式數(shù)據(jù)的變化,如果需要在數(shù)據(jù)變化后執(zhí)行操作,修改依賴項,那么就應該使用偵聽器,下面就跟隨小編一起來學習一下vue3中偵聽器的使用吧

偵聽器

偵聽器和計算屬性都可以用于偵聽響應式數(shù)據(jù)的變化,如果需要在數(shù)據(jù)變化后執(zhí)行操作,修改依賴項,那么就應該使用偵聽器
watchwatchEffect都可以偵聽數(shù)據(jù)源并執(zhí)行回調(diào)操作,不同的是他們追蹤響應式依賴的方式。

watch:只追蹤指定的數(shù)據(jù)源,所以可以精確地控制回調(diào)函數(shù)的觸發(fā)時機

watchEffect:自動追蹤回調(diào)內(nèi)的響應式數(shù)據(jù),相比watch更加簡潔,但有時其響應性依賴關系會不那么明確。

watch函數(shù)

第一個參數(shù)需要指定需要偵聽的數(shù)據(jù)。

可以是響應式數(shù)據(jù)(ref、reactive、computed...)、getter函數(shù)、也可以是以上數(shù)據(jù)源組成的數(shù)組,也就是同時偵聽多個數(shù)據(jù)源。

第二個參數(shù)是在偵聽到數(shù)據(jù)變動時,需要執(zhí)行的回調(diào)方法。

該回調(diào)方法有兩個參數(shù),第一個為數(shù)據(jù)更新后的值,第二個為數(shù)據(jù)更新前的值。

import { ref, watch } from 'vue'
const count = ref(0)
const price = ref(10)
// 偵聽響應式數(shù)據(jù)
watch(count, (newVal, oldVal) => {
    // 每當count更新時,都會執(zhí)行這里的函數(shù)
    console.log("new count:", newVal) // 1  更新后的值
    console.log("old count:", oldVal) // 0  更新前的值
})
// 偵聽getter函數(shù)
watch(
    () => count.value * price.value,
    (newVal, oldVal) => {
        // 每當count或者price更新時,都會執(zhí)行這里的函數(shù)
        console.log("新總價:", newVal) // 10  更新后的值
        console.log("舊總價:", oldVal) // 0  更新前的值
    })
// 使用數(shù)組偵聽多個數(shù)據(jù)源
watch(
    [count, () => price.value],
    (newValArr, oldValArr) => {
        // 每當count或者price更新時,都會執(zhí)行這里的函數(shù)
        // 需要注意此時的回調(diào)數(shù)據(jù)為數(shù)組
        // newValArr[0] count
        // newValArr[1] () => price.value]
        // oldValArr 同上
        console.log(newValArr) // [1, 10]  更新后的值
        console.log(oldValArr) // [0, 10]  更新前的值
    })
count.value++ // 更新count值

可選配置

以上兩個參數(shù)在偵聽器中是必傳的,除此之外watch函數(shù)還有一些可選配置。

立即執(zhí)行

watch默認是在數(shù)據(jù)源更新時才會執(zhí)行回調(diào),如果想要在創(chuàng)建時立刻執(zhí)行回調(diào)函數(shù),就可以通過傳入 immediate:true 使偵聽器的回調(diào)立即執(zhí)行

const count = ref(0)
watch(count, (newVal,oldVal) => {
    console.log(newVal)  // 0
    console.log(oldVal)  // undefind
}, {
    immediate: true  // 創(chuàng)建時立即執(zhí)行一次回調(diào)
})

深層偵聽器

給watch函數(shù)傳入一個響應式對象,會隱式地創(chuàng)建一個深層偵聽器——該回調(diào)函數(shù)在所有嵌套的變更時都會被觸發(fā):

const obj1 = reactive({ val: 1 })
watch(obj1, (newVal, oldVal) => {
    // 在obj的嵌套屬性變更時觸發(fā)
    // 注意此處的newVal oldVal的值是相等的
    // 因為他們是同一個對象
})
const obj2 = ref({ val: 2 })
// 傳入ref偵聽的對象時,添加.value才會默認創(chuàng)建深層偵聽
watch(obj2.value, (newVal, oldVal) => {})
obj1.val++
obj2.value.val++

當直接傳入ref創(chuàng)建的對象或是返回響應式對象的getter函數(shù)時,只有在它們的對象被整個替換時才會觸發(fā)回調(diào)。如果也想創(chuàng)建深層偵聽,可以通過傳入deep:true強制轉(zhuǎn)成深層偵聽器。

// 當直接傳入ref創(chuàng)建的對象或是返回響應式對象的getter函數(shù)時
// 只有在它們的對象被整個替換時才會觸發(fā)回調(diào)
//  例:obj2.value = { val: 3 }
// 傳入deep選項即可創(chuàng)建深層偵聽
// getter函數(shù)
watch(() => obj2.value, (newVal, oldVal) => {
    // 注意此處的newVal oldVal的值是相等的
    // 除非替換掉整個obj2.value
}, {
    deep: true   // 當值變更時觸發(fā)回調(diào)
})
// ref創(chuàng)建的對象數(shù)據(jù)
watch(obj2, (newVal, oldVal) => {
    // 注意此處的newVal oldVal的值是相等的
    // 除非替換掉整個obj2.value
}, {
    deep: true   // 當值變更時觸發(fā)回調(diào)
})

watchEffect函數(shù)

和計算屬性一樣,不需要指定要偵聽的響應式數(shù)據(jù),而是會自動跟蹤回調(diào)的響應式依賴,并在依賴變化時重新執(zhí)行回調(diào)函數(shù);

并且創(chuàng)建后回調(diào)會立即執(zhí)行一次(不需要傳入 immediate:true);

相比watch函數(shù)更加簡潔方便。

import { ref, watchEffect } from 'vue';
const count = ref(0)
watchEffect(() => {
    console.log(count.value) // 0
})

停止偵聽

當業(yè)務需要,或者在異步操作中創(chuàng)建偵聽器時,

可以通過以下方法來停止偵聽器。

const unwatch = watchEffect(() => { })
// 當不需要時調(diào)用 unwatch() 即可銷毀偵聽
unwatch()
setTimeout(() => {
  // 在同步中創(chuàng)建的偵聽器在組件銷毀時,自動停止,而異步中創(chuàng)建的不會!
  watchEffect(() => {})
}, 100)

DOM更新后觸發(fā)回調(diào)

偵聽的數(shù)據(jù)源變更,有可能同時觸發(fā)vue組件更新與偵聽器回調(diào)。

默認情況下,回調(diào)會在組件更新之前執(zhí)行,也就是在回調(diào)中獲取dom獲取到的是vue組件更新之前的狀態(tài),

如果想要在回調(diào)中訪問更新之后的狀態(tài)那么就需要傳入flush: 'post'選項

watch(count, ()=>{
}, {
  flush: 'post'
})
watchEffect(()=>{
}, {
  flush: 'post'
})

注意點

watch函數(shù)的回調(diào)參數(shù)

回調(diào)函數(shù)的參數(shù)有兩個,第一個為"新值",第二個為"舊值",如果只需要使用"新值",可以忽略第二個值,

如果監(jiān)聽的數(shù)據(jù)是對象,那么他們的"新值"與"舊值"是相等的,因為都指向同一個內(nèi)存地址,除非整個替換掉。

盡量不要在異步中創(chuàng)建偵聽

盡量不要在異步中創(chuàng)建偵聽,在異步中創(chuàng)建的偵聽不會自動銷毀,如果在異步中創(chuàng)建偵聽,請手動結(jié)束偵聽。

到此這篇關于一文帶你掌握vue3中偵聽器的使用的文章就介紹到這了,更多相關vue3偵聽器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue.js計算屬性computed用法實例分析

    vue.js計算屬性computed用法實例分析

    這篇文章主要介紹了vue.js計算屬性computed用法,結(jié)合實例形式分析了vue.js使用computed方式進行屬性計算的相關操作技巧,需要的朋友可以參考下
    2018-07-07
  • VUE3+Element-plus中el-form的使用示例代碼

    VUE3+Element-plus中el-form的使用示例代碼

    這篇文章主要介紹了VUE3+Element-plus中el-form的使用示例代碼,本文通過圖文示例代碼相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • vue3中使用props和emits并指定其類型與默認值

    vue3中使用props和emits并指定其類型與默認值

    props是Vue3中的一個重要概念,它允許我們將數(shù)據(jù)從父組件傳遞到子組件,下面這篇文章主要給大家介紹了關于vue3中使用props和emits并指定其類型與默認值的相關資料,需要的朋友可以參考下
    2023-04-04
  • vue使用router-view調(diào)用頁面方式

    vue使用router-view調(diào)用頁面方式

    這篇文章主要介紹了vue使用router-view調(diào)用頁面方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • vue的列表交錯過渡實現(xiàn)代碼示例

    vue的列表交錯過渡實現(xiàn)代碼示例

    這篇文章主要介紹了vue的列表交錯過渡實現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • vue組件發(fā)布到npm簡單步驟

    vue組件發(fā)布到npm簡單步驟

    給大家講解一下vue組件發(fā)布到npm簡單方法和步驟過程,需要的朋友一起學習參考一下。
    2017-11-11
  • 詳解如何在vue項目中引入elementUI組件

    詳解如何在vue項目中引入elementUI組件

    這篇文章主要介紹了詳解如何在vue項目中引入elementUI組件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • vue實現(xiàn)評論列表

    vue實現(xiàn)評論列表

    這篇文章主要為大家詳細介紹了vue實現(xiàn)評論列表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue3實現(xiàn)預覽PDF文件的多種方式(超簡單)

    Vue3實現(xiàn)預覽PDF文件的多種方式(超簡單)

    在Vue項目中實現(xiàn)PDF文件預覽是許多開發(fā)者可能會遇到的需求,尤其是在開發(fā)海外后臺管理系統(tǒng)時,由于某些用戶上傳的文件格式為PDF,而Vue本身并不直接支持PDF文件的預覽功能,這就需要借助一些第三方的插件或者工具來完成,下面詳細地介紹幾種在Vue3中實現(xiàn)PDF文件預覽的方法
    2025-03-03
  • vue業(yè)務實例之組件遞歸及其應用

    vue業(yè)務實例之組件遞歸及其應用

    目中出現(xiàn)多級菜單時,需要多層for循環(huán)時,但是當菜單增加層級時,需要在頁面結(jié)構(gòu)中增加一層for循環(huán),這時我們可以使用組件遞歸的思想來實現(xiàn),下面這篇文章主要給大家介紹了關于vue業(yè)務實例之組件遞歸及其應用的相關資料,需要的朋友可以參考下
    2022-05-05

最新評論