国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue全家桶進(jìn)階之路32:Vue3 WatchEffect和watch 監(jiān)聽

這篇具有很好參考價(jià)值的文章主要介紹了vue全家桶進(jìn)階之路32:Vue3 WatchEffect和watch 監(jiān)聽。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在 Vue 3 中,watchEffect 是一個(gè)用于監(jiān)聽響應(yīng)式數(shù)據(jù)變化的 API。它可以在函數(shù)內(nèi)部自動(dòng)跟蹤數(shù)據(jù)的依賴,并在依賴變化時(shí)重新運(yùn)行函數(shù)。

watchEffect?的作用以及各個(gè)參數(shù)的功能講解:

watchEffect(effect: (onInvalidate: InvalidateCbRegistrator) => void | (() => void) | Promise<void>, options?: WatchEffectOptions): WatchStopHandle

    • effect:要監(jiān)聽的響應(yīng)式數(shù)據(jù)以及需要執(zhí)行的副作用函數(shù)。effect 函數(shù)接收一個(gè) onInvalidate 回調(diào)函數(shù)作為參數(shù),用于在 effect 的依賴發(fā)生變化時(shí)執(zhí)行清理函數(shù)。effect 函數(shù)可以返回一個(gè)清理函數(shù),也可以返回一個(gè) Promise,Promise 完成時(shí)執(zhí)行的函數(shù)也會被視為清理函數(shù)。如果 effect 函數(shù)中使用的數(shù)據(jù)沒有在響應(yīng)式對象中被引用,那么 watchEffect 不會監(jiān)聽到這些數(shù)據(jù)的變化。
    • options:監(jiān)聽選項(xiàng)對象,可選。可以用來配置監(jiān)聽的行為,例如 deep、flush 等選項(xiàng)。具體的選項(xiàng)請參考下面的講解。
    • 返回值:一個(gè)函數(shù),調(diào)用它可以停止監(jiān)聽。

WatchEffectOptions

    watchEffect 函數(shù)接受一個(gè)可選的選項(xiàng)對象,用于配置監(jiān)聽行為。以下是 WatchEffectOptions 對象的屬性及其功能:

    • lazy:是否延遲執(zhí)行 effect 函數(shù)。如果設(shè)置為 true,則在首次調(diào)用 watchEffect 時(shí)不會執(zhí)行 effect 函數(shù),只有在其依賴發(fā)生變化時(shí)才會執(zhí)行。默認(rèn)為 false
    • deep:是否深度監(jiān)聽對象和數(shù)組的變化,默認(rèn)為 false。如果設(shè)置為 true,則會遞歸監(jiān)聽對象和數(shù)組中的所有屬性。
    • flush:何時(shí)執(zhí)行回調(diào)函數(shù)。默認(rèn)為 'pre',表示在響應(yīng)式數(shù)據(jù)變化后立即執(zhí)行回調(diào)函數(shù),但在同一事件循環(huán)中的其他變化不會觸發(fā)回調(diào)函數(shù)。如果設(shè)置為 'post',則會在同一事件循環(huán)中的所有變化都發(fā)生后執(zhí)行回調(diào)函數(shù)。

例如,以下代碼使用 watchEffect 監(jiān)聽 message 的變化,并在變化時(shí)執(zhí)行回調(diào)函數(shù)。

import { watchEffect } from 'vue';

watchEffect(() => {
  console.log(`message 變?yōu)?${message}`);
});

?

下面是一個(gè)簡單的例子,演示了如何使用 watchEffect 監(jiān)聽響應(yīng)式數(shù)據(jù)變化:

<template>
  <div>
    <p>輸入框的值為:{{ message }}</p>
    <input v-model="message" />
  </div>
</template>

<script>
import { defineComponent, ref, watchEffect } from 'vue';

export default defineComponent({
  setup() {
    const message = ref('');

    watchEffect(() => {
      console.log(`message 值改變?yōu)椋?{message.value}`);
    });

    return {
      message
    };
  }
});
</script>

在這個(gè)例子中,我們使用 ref 函數(shù)定義了一個(gè)名為 message 的響應(yīng)式數(shù)據(jù),并將其初始化為空字符串。我們使用 watchEffect 函數(shù)監(jiān)聽 message 的變化,并在函數(shù)內(nèi)部打印出 message 的值。因?yàn)?watchEffect 函數(shù)會自動(dòng)跟蹤 message 的依賴,所以當(dāng)用戶在輸入框中輸入內(nèi)容時(shí),watchEffect 函數(shù)就會重新運(yùn)行,打印出新的 message 值。

需要注意的是,watchEffect 函數(shù)的回調(diào)函數(shù)不需要顯式地指定依賴項(xiàng),它會自動(dòng)跟蹤回調(diào)函數(shù)內(nèi)部使用到的所有響應(yīng)式數(shù)據(jù)。因此,當(dāng)你使用 watchEffect 函數(shù)時(shí),不需要再使用 watch 函數(shù)或 computed 函數(shù)來監(jiān)聽數(shù)據(jù)變化。但是,如果你需要監(jiān)聽某個(gè)特定的響應(yīng)式數(shù)據(jù)變化,可以在回調(diào)函數(shù)中使用該數(shù)據(jù),這樣 watchEffect 就會自動(dòng)跟蹤它。

watchEffect 函數(shù)的返回值是一個(gè)用于停止監(jiān)聽的函數(shù)。當(dāng)你調(diào)用這個(gè)函數(shù)時(shí),watchEffect 就會停止監(jiān)聽響應(yīng)式數(shù)據(jù)的變化。

以下是一個(gè)示例,演示如何使用 watchEffect 函數(shù)的返回值停止監(jiān)聽:

<template>
  <div>
    <p>輸入框的值為:{{ message }}</p>
    <button @click="stopWatching">停止監(jiān)聽</button>
    <input v-model="message" />
  </div>
</template>

<script>
import { defineComponent, ref, watchEffect } from 'vue';

export default defineComponent({
  setup() {
    const message = ref('');

    const stopWatching = watchEffect(() => {
      console.log(`message 值改變?yōu)椋?{message.value}`);
    });

    function stopWatching() {
      stopWatching();
    }

    return {
      message,
      stopWatching
    };
  }
});
</script>

在這個(gè)例子中,我們定義了一個(gè)名為 stopWatching 的函數(shù),它調(diào)用了 watchEffect 函數(shù)的返回值,從而停止了監(jiān)聽。我們在模板中添加了一個(gè)按鈕,當(dāng)用戶點(diǎn)擊它時(shí),就會調(diào)用 stopWatching 函數(shù),從而停止監(jiān)聽 message 的變化。

?

?

watch的作用以及各個(gè)參數(shù)的功能講解:

watch 是 Vue 3 中用于監(jiān)聽響應(yīng)式數(shù)據(jù)變化的 API,它能夠在響應(yīng)式數(shù)據(jù)發(fā)生變化時(shí)執(zhí)行回調(diào)函數(shù)。以下是 watch 函數(shù)的參數(shù)及其功能:

  1. watch(source: string | Function | Ref, callback: Function, options?: WatchOptions): WatchStopHandle
  • source:要監(jiān)聽的響應(yīng)式數(shù)據(jù),可以是一個(gè)字符串(表示要監(jiān)聽的數(shù)據(jù)在組件實(shí)例中的屬性名)、一個(gè)函數(shù)(返回要監(jiān)聽的數(shù)據(jù))或一個(gè) ref 對象。
  • callback:響應(yīng)式數(shù)據(jù)變化時(shí)要執(zhí)行的回調(diào)函數(shù)?;卣{(diào)函數(shù)接收兩個(gè)參數(shù):新值和舊值。
  • options:監(jiān)聽選項(xiàng)對象,可選??梢杂脕砼渲帽O(jiān)聽的行為,例如 deep、immediate 等選項(xiàng)。具體的選項(xiàng)請參考下面的講解。
  • 返回值:一個(gè)函數(shù),調(diào)用它可以停止監(jiān)聽。
  1. WatchOptions

watch 函數(shù)接受一個(gè)可選的選項(xiàng)對象,用于配置監(jiān)聽行為。以下是 WatchOptions 對象的屬性及其功能:

  • immediate:是否在監(jiān)聽開始時(shí)立即執(zhí)行回調(diào)函數(shù),默認(rèn)為 false。
  • deep:是否深度監(jiān)聽對象和數(shù)組的變化,默認(rèn)為 false。如果設(shè)置為 true,則會遞歸監(jiān)聽對象和數(shù)組中的所有屬性。
  • flush:何時(shí)執(zhí)行回調(diào)函數(shù)。默認(rèn)為 'pre',表示在響應(yīng)式數(shù)據(jù)變化后立即執(zhí)行回調(diào)函數(shù),但在同一事件循環(huán)中的其他變化不會觸發(fā)回調(diào)函數(shù)。如果設(shè)置為 'post',則會在同一事件循環(huán)中的所有變化都發(fā)生后執(zhí)行回調(diào)函數(shù)。
  • onTrack:監(jiān)視屬性被訪問的函數(shù)。它接收一個(gè)追蹤對象(TrackOpTypes)和追蹤的目標(biāo)對象(target)??梢杂盟鼇磉M(jìn)行依賴追蹤分析等操作。
  • onTrigger:監(jiān)視屬性被修改的函數(shù)。它接收一個(gè)觸發(fā)對象(TriggerOpTypes)和觸發(fā)的目標(biāo)對象(target)??梢杂盟鼇磉M(jìn)行調(diào)試、性能分析等操作。
  • 例如,以下代碼監(jiān)聽 message 的變化,并在變化時(shí)執(zhí)行回調(diào)函數(shù),同時(shí)設(shè)置 immediate 選項(xiàng)為 true,表示在組件掛載時(shí)立即執(zhí)行一次回調(diào)函數(shù)。

import { watch } from 'vue';

watch(
  () => message, // 要監(jiān)聽的響應(yīng)式數(shù)據(jù)
  (newValue, oldValue) => {
    console.log(`message 從 ${oldValue} 變?yōu)?${newValue}`);
  },
  {
    immediate: true // 在組件掛載時(shí)立即執(zhí)行回調(diào)函數(shù)
  }
);

?

watchEffectwatch 都是 Vue 3 中用于監(jiān)聽響應(yīng)式數(shù)據(jù)變化的 API,它們之間的主要區(qū)別在于回調(diào)函數(shù)的類型和依賴項(xiàng)的聲明方式。

  • watchEffect 接收一個(gè)不帶參數(shù)的函數(shù)作為回調(diào)函數(shù),在函數(shù)內(nèi)部使用到的響應(yīng)式數(shù)據(jù)變化時(shí)會自動(dòng)觸發(fā)回調(diào)函數(shù)。watchEffect 會自動(dòng)追蹤響應(yīng)式數(shù)據(jù)的變化,并在每次變化時(shí)重新運(yùn)行回調(diào)函數(shù)。
  • watch 接收兩個(gè)參數(shù):第一個(gè)參數(shù)是要監(jiān)聽的響應(yīng)式數(shù)據(jù),第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù)?;卣{(diào)函數(shù)接收兩個(gè)參數(shù):新值和舊值。在響應(yīng)式數(shù)據(jù)變化時(shí),watch 會調(diào)用回調(diào)函數(shù),并傳入新值和舊值??梢酝ㄟ^第三個(gè)參數(shù)來聲明要監(jiān)聽的選項(xiàng),例如 deep、immediate 等。

因?yàn)?watchEffect 自動(dòng)追蹤響應(yīng)式數(shù)據(jù)的變化,所以它更適合處理簡單的數(shù)據(jù)邏輯。如果需要監(jiān)聽特定的響應(yīng)式數(shù)據(jù)或使用更高級的選項(xiàng),可以使用 watch 函數(shù)。使用 watch 函數(shù)需要顯式聲明要監(jiān)聽的響應(yīng)式數(shù)據(jù),這可以使代碼更具可讀性。此外,watch 函數(shù)還支持聲明多個(gè)要監(jiān)聽的響應(yīng)式數(shù)據(jù),這使得它可以處理更復(fù)雜的數(shù)據(jù)邏輯。

總之,如果你只需要監(jiān)聽一些簡單的響應(yīng)式數(shù)據(jù)變化,可以使用 watchEffect 函數(shù)。如果需要監(jiān)聽特定的響應(yīng)式數(shù)據(jù)或使用更高級的選項(xiàng),可以使用 watch 函數(shù)。

以下是一個(gè)示例,演示 watchEffectwatch 的差別:

<template>
  <div>
    <p>message1 值為:{{ message1 }}</p>
    <p>message2 值為:{{ message2 }}</p>
    <button @click="increment">增加 message1 和 message2 的值</button>
  </div>
</template>

<script>
import { defineComponent, ref, watchEffect, watch } from 'vue';

export default defineComponent({
  setup() {
    const message1 = ref(0);
    const message2 = ref(0);

    // watchEffect 自動(dòng)追蹤響應(yīng)式數(shù)據(jù)的變化
    watchEffect(() => {
      console.log(`message1 值變?yōu)?${message1.value}`);
    });

    // watch 需要顯式聲明要監(jiān)聽的響應(yīng)式數(shù)據(jù)
    watch(message2, (newValue, oldValue) => {
      console.log(`message2 從 ${oldValue} 變?yōu)?${newValue}`);
    });

    function increment() {
      message1.value++;
      message2.value++;
    }

    return {
      message1,
      message2,
      increment
    };
  }
});
</script>

在這個(gè)例子中,我們聲明了兩個(gè)響應(yīng)式數(shù)據(jù) message1message2,并分別使用了 watchEffectwatch 監(jiān)聽它們的變化。watchEffect 自動(dòng)追蹤 message1 的變化,并在變化時(shí)觸發(fā)回調(diào)函數(shù)。而 watch 則需要顯式聲明要監(jiān)聽的 message2,并在它的變化時(shí)觸發(fā)回調(diào)函數(shù)。在點(diǎn)擊按鈕時(shí),我們同時(shí)增加了 message1message2 的值,從而觸發(fā)了相應(yīng)的回調(diào)函數(shù)。

watchEffectwatch 的區(qū)別在于,watchEffect 監(jiān)聽的是一個(gè)函數(shù)的副作用,而 watch 監(jiān)聽的是一個(gè)具體的響應(yīng)式數(shù)據(jù),因此 watchEffect 不需要顯式指定監(jiān)聽的數(shù)據(jù),它會自動(dòng)檢測 effect 函數(shù)中使用的響應(yīng)式數(shù)據(jù),并在其發(fā)生變化時(shí)執(zhí)行回調(diào)函數(shù)。此外,watchEffect 也不需要手動(dòng)停止監(jiān)聽,它會在組件卸載時(shí)自動(dòng)停止監(jiān)聽。但是,watchEffect 不支持監(jiān)聽選項(xiàng)對象中的 immediateonTrackonTrigger 屬性。

?

?

如果watch的監(jiān)聽對象是數(shù)組:

如果 watch 監(jiān)聽的是一個(gè)數(shù)組,則可以使用 deep 選項(xiàng)來深度監(jiān)聽數(shù)組元素的變化。當(dāng) deeptrue 時(shí),watch 會遞歸監(jiān)聽數(shù)組中每個(gè)元素的變化。

例如,以下代碼使用 watch 監(jiān)聽 list 數(shù)組的變化,并在變化時(shí)執(zhí)行回調(diào)函數(shù)。

import { watch } from 'vue';

watch(
  () => list,
  (newList, oldList) => {
    console.log('list 變化了', newList, oldList);
  },
  { deep: true }
);

在上面的代碼中,watch 監(jiān)聽的是一個(gè)計(jì)算屬性,計(jì)算屬性返回 list 數(shù)組。由于在監(jiān)聽選項(xiàng)中設(shè)置了 deep: true,因此 watch 會深度監(jiān)聽 list 數(shù)組,即遞歸監(jiān)聽數(shù)組中每個(gè)元素的變化。

注意,當(dāng)使用 deep 選項(xiàng)監(jiān)聽數(shù)組時(shí),如果數(shù)組中的元素是對象,則需要確保這些對象是響應(yīng)式的,否則無法監(jiān)聽它們的變化。如果數(shù)組中的元素不是響應(yīng)式的對象,則無法監(jiān)聽其變化。文章來源地址http://www.zghlxwxcb.cn/news/detail-416507.html

到了這里,關(guān)于vue全家桶進(jìn)階之路32:Vue3 WatchEffect和watch 監(jiān)聽的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue全家桶進(jìn)階之路34:Vue3 路由基本配置

    在Vue3中,路由的基本配置是通過使用Vue Router庫來實(shí)現(xiàn)的。以下是Vue3中路由的基本配置步驟: 安裝Vue Router 使用npm或yarn在項(xiàng)目中安裝Vue Router: 創(chuàng)建路由實(shí)例 創(chuàng)建一個(gè)路由實(shí)例并定義路由規(guī)則。路由規(guī)則是一個(gè)對象數(shù)組,其中每個(gè)對象都定義了一個(gè)路由的路徑和組件。 例如

    2023年04月18日
    瀏覽(24)
  • vue全家桶進(jìn)階之路46:Vue3 Axios攔截器

    在Vue.js 3中,使用Axios與Vue.js 2.x中類似,但是需要進(jìn)行一些修改和更新,下面是Vue.js 3中Axios的定義和使用方式: 首先,你需要安裝Axios和Vue.js 3.x,可以使用npm或yarn等包管理工具安裝: 然后,在你的Vue.js 3應(yīng)用程序中,你可以使用以下代碼來導(dǎo)入和使用Axios: 上面的代碼使用

    2023年04月20日
    瀏覽(28)
  • vue全家桶進(jìn)階之路50:Vue3 環(huán)境變量+跨域設(shè)置實(shí)例

    使用.env加后綴的方式來建立某個(gè)模式下的環(huán)境變量, 例如:項(xiàng)目根目錄新建兩個(gè)環(huán)境變量文件(development開發(fā)環(huán)境和production生產(chǎn)環(huán)境): ?在新建的兩個(gè)環(huán)境變量文件中設(shè)置相同的環(huán)境變量名: 環(huán)境變量名稱必須以\\\"VUE_API_\\\"+名稱的格式,否則不生效,這個(gè)格式是死的。至于

    2023年04月21日
    瀏覽(18)
  • vue3 watch & watchEffect

    watch watchEffect 函數(shù)都是監(jiān)聽器, 用于監(jiān)視數(shù)據(jù)的變化; watch 有惰性,watchEffect 無惰性;watch 需要指定具體的監(jiān)視屬性,watchEffect 不需要指定具體的監(jiān)視屬性和配置參數(shù),會自動(dòng)感知代碼依賴;watch 能獲取到以前的舊值和新值,watchEffect 只能拿到最新值 一、watch 監(jiān)聽 1、watch 監(jiān)視

    2024年02月09日
    瀏覽(27)
  • vue全家桶進(jìn)階之路48:Vue3 跨域配置devServer的參數(shù)和設(shè)置

    devServer 是一個(gè)用于配置開發(fā)服務(wù)器的選項(xiàng)對象。它可以用來配置服務(wù)器的各種選項(xiàng),例如代理,端口號,HTTPS 等。 以下是一些常用的 devServer 參數(shù)和設(shè)置: port :指定開發(fā)服務(wù)器的端口號,默認(rèn)為 8080 。 host :指定開發(fā)服務(wù)器的主機(jī)名,默認(rèn)為 localhost 。 https :開啟 HTTPS,可

    2023年04月21日
    瀏覽(25)
  • vue全家桶進(jìn)階之路47:Vue3 Axios攔截器封裝成request文件

    可以將Axios攔截器封裝成一個(gè)單獨(dú)的request文件,以便在整個(gè)應(yīng)用程序中重復(fù)使用。 以下是一個(gè)示例,展示如何將Axios攔截器封裝成一個(gè)request文件: 1、創(chuàng)建一個(gè)名為request.js的新文件,并導(dǎo)入Axios: 2、創(chuàng)建一個(gè)名為request的函數(shù),并將其導(dǎo)出: 這將創(chuàng)建一個(gè)名為request的函數(shù),

    2023年04月21日
    瀏覽(95)
  • vue全家桶進(jìn)階之路46:Vue3 Axios攔截器和globalProperties全局設(shè)置

    在Vue.js 3中,使用Axios與Vue.js 2.x中類似,但是需要進(jìn)行一些修改和更新,下面是Vue.js 3中Axios的定義和使用方式: 首先,你需要安裝Axios和Vue.js 3.x,可以使用npm或yarn等包管理工具安裝: 然后,在你的Vue.js 3應(yīng)用程序中,你可以使用以下代碼來導(dǎo)入和使用Axios: 上面的代碼使用

    2023年04月20日
    瀏覽(21)
  • [vue3] watch和watchEffect簡記

    watch函數(shù)的第一個(gè)參數(shù)是監(jiān)聽的數(shù)據(jù)源,可以是: ref和computed創(chuàng)建的響應(yīng)式數(shù)據(jù); reactive創(chuàng)建的響應(yīng)式對象; getter函數(shù); 多個(gè)數(shù)據(jù)源組成的數(shù)組; 注 : 響應(yīng)式對象的屬性需要使用getter監(jiān)聽。 當(dāng)數(shù)據(jù)源是響應(yīng)式對象時(shí),其屬性的變更會觸發(fā)回調(diào)函數(shù),但是接收到的 newValue 和

    2024年02月06日
    瀏覽(17)
  • vue全家桶進(jìn)階之路43:Vue3 Element Plus el-form表單組件

    在 Element Plus 中, el-form 是一個(gè)表單組件,用于創(chuàng)建表單以便用戶填寫和提交數(shù)據(jù)。它提供了許多內(nèi)置的驗(yàn)證規(guī)則和驗(yàn)證方法,使表單驗(yàn)證更加容易。 使用 el-form 組件,您可以將表單控件組織在一起,并對表單進(jìn)行驗(yàn)證,以確保提交的數(shù)據(jù)符合預(yù)期的格式和要求。該組件具有

    2023年04月20日
    瀏覽(24)
  • vue全家桶進(jìn)階之路31:Vue3 數(shù)據(jù)和方法的雙向綁定ref、reactive、toRefs

    ref 在 Vue 3 中,你可以使用 setup 函數(shù)來定義組件的數(shù)據(jù)和方法。在 setup 函數(shù)中,你可以使用 ref 、 reactive 和 computed 等 Vue 3 的響應(yīng)式 API 來定義數(shù)據(jù),并返回一個(gè)包含你需要公開的數(shù)據(jù)和方法的對象。下面是一個(gè)例子: 在這個(gè)例子中,我們使用 ref 函數(shù)來定義了一個(gè)名為 mes

    2023年04月19日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包