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

Vue3中watchEffect的用途淺析

 更新時間:2021年07月05日 14:34:22   作者:李孤雛  
這篇文章主要給大家介紹了關(guān)于Vue3中watchEffect用途的相關(guān)資料, watch和watchEffect都是監(jiān)聽器,但在寫法和使用上有所區(qū)別,本文進(jìn)行了詳細(xì)的介紹,需要的朋友可以參考下

前言

vue2里面的 watch api 大家應(yīng)該都挺熟悉的了, vue2中vue實例里面有一個 $watch 方法 在sfc(sigle file component)里面有一個 watch 選項。他可以實現(xiàn)在一個屬性變更的時候,去執(zhí)行我們想要的行為。比如:

  • 當(dāng)ID改變的時候,從數(shù)據(jù)庫里面獲取新的數(shù)據(jù)。
  • 當(dāng)屬性變換的時候執(zhí)行一個動畫。
  • 當(dāng)搜索條件變更的時候,更新查詢到的數(shù)據(jù)。

但是 vue3 除了 watch api, 還新增了一個 watchEffect 的 api, 我們來看看他的用法。

我們收集了一個 userID 的依賴,然后在 userID 改變的時候,就會執(zhí)行watchEffect 的回調(diào)。

// 例子靈感來源于[文檔](https://v3.vuejs.org/api/computed-watch-api.html#watcheffect)

import { watchEffect, ref } from 'vue'
setup () {
    const userID = ref(0)
    watchEffect(() => console.log(userID))
    setTimeout(() => {
      userID.value = 1
    }, 1000)

    /*
      * LOG
      * 0 
      * 1
    */

    return {
      userID
    }
 }

與 watch 有什么不同?

  • 第一點我們可以從示例代碼中看到 watchEffect 不需要指定監(jiān)聽的屬性,他會自動的收集依賴, 只要我們回調(diào)中引用到了 響應(yīng)式的屬性, 那么當(dāng)這些屬性變更的時候,這個回調(diào)都會執(zhí)行,而 watch 只能監(jiān)聽指定的屬性而做出變更(v3開始可以同時指定多個)。
  • 第二點就是 watch 可以獲取到新值與舊值(更新前的值),而 watchEffect 是拿不到的。
  • 第三點是 watchEffect 如果存在的話,在組件初始化的時候就會執(zhí)行一次用以收集依賴(與computed同理),而后收集到的依賴發(fā)生變化,這個回調(diào)才會再次執(zhí)行,而 watch 不需要,因為他一開始就指定了依賴。

從他們的不同點可以看出,他們的優(yōu)缺點。并且可以在業(yè)務(wù)需求面前做出正確的選擇。

watchEffect 進(jìn)階

停止監(jiān)聽

watchEffect 會返回一個用于停止這個監(jiān)聽的函數(shù),如法如下:

const stop = watchEffect(() => {
  /* ... */
})

// later
stop()

例子來源于官方文檔, 上面有鏈接。

如果 watchEffect 是在 setup 或者 生命周期里面注冊的話,在組件取消掛載的時候會自動的停止掉。

使 side effect 無效

什么是 side effect ,不可預(yù)知的接口請求就是一個 side effect,假設(shè)我們現(xiàn)在用一個用戶ID去查詢用戶的詳情信息,然后我們監(jiān)聽了這個用戶ID, 當(dāng)用戶ID 改變的時候我們就會去發(fā)起一次請求,這很簡單,用watch 就可以做到。 但是如果在請求數(shù)據(jù)的過程中,我們的用戶ID發(fā)生了多次變化,那么我們就會發(fā)起多次請求,而最后一次返回的數(shù)據(jù)將會覆蓋掉我們之前返回的所有用戶詳情。這不僅會導(dǎo)致資源浪費,還無法保證 watch 回調(diào)執(zhí)行的順序。而使用 watchEffect 我們就可以做到。

onInvalidate()

onInvalidate(fn)傳入的回調(diào)會在 watchEffect 重新運行或者 watchEffect 停止的時候執(zhí)行

watchEffect(() => {
      // 異步api調(diào)用,返回一個操作對象
      const apiCall = someAsyncMethod(props.userID)

      onInvalidate(() => {
        // 取消異步api的調(diào)用。
        apiCall.cancel()
      })
})

借助 onInvalidate 我們就可以對上面所述的情況作出比較優(yōu)雅的優(yōu)化。

總結(jié)

到此這篇關(guān)于Vue3中watchEffect用途的文章就介紹到這了,更多相關(guān)Vue3 watchEffect用途內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決element-ui中Popconfirm氣泡確認(rèn)框的事件不生效問題

    解決element-ui中Popconfirm氣泡確認(rèn)框的事件不生效問題

    這篇文章主要介紹了解決element-ui中Popconfirm氣泡確認(rèn)框的事件不生效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 聊聊Vue中provide/inject的應(yīng)用詳解

    聊聊Vue中provide/inject的應(yīng)用詳解

    這篇文章主要介紹了聊聊Vue中provide/inject的應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁面,前面加默認(rèn)域名端口的問題

    解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁面,前面加默認(rèn)域名端口的問題

    這篇文章主要介紹了解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁面,前面加默認(rèn)域名端口的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue新手指南之創(chuàng)建第一個vue-cli腳手架程序

    Vue新手指南之創(chuàng)建第一個vue-cli腳手架程序

    vue-cli 是一個官方發(fā)布 vue.js 項目腳手架,使用 vue-cli 可以快速創(chuàng)建 vue 項目。這篇文章主要給大家介紹了關(guān)于Vue新手指南之創(chuàng)建第一個vue-cli程序的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • vue element實現(xiàn)表格增加刪除修改數(shù)據(jù)

    vue element實現(xiàn)表格增加刪除修改數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了vue element實現(xiàn)表格增加刪除修改數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 詳解關(guān)于Vue單元測試的幾個坑

    詳解關(guān)于Vue單元測試的幾個坑

    這篇文章主要介紹了關(guān)于Vue單元測試的幾個坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • vue?文件切片上傳的項目實現(xiàn)

    vue?文件切片上傳的項目實現(xiàn)

    本文主要介紹了vue?文件切片上傳的項目實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • vue elementUI 表單校驗的實現(xiàn)代碼(多層嵌套)

    vue elementUI 表單校驗的實現(xiàn)代碼(多層嵌套)

    這篇文章主要介紹了vue elementUI 表單校驗的實現(xiàn)代碼(多層嵌套),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue?中使用?this?更新數(shù)據(jù)的一次問題記錄

    vue?中使用?this?更新數(shù)據(jù)的一次問題記錄

    這篇文章主要介紹了vue?中使用?this?更新數(shù)據(jù)的一次大坑?,我在 vue 實例中聲明了一個數(shù)組屬性如?books: [],在異步請求的回調(diào)函數(shù)中使用?this.books = res.data.data;?進(jìn)行數(shù)據(jù)更新,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • vue微信分享出來的鏈接點開是首頁問題的解決方法

    vue微信分享出來的鏈接點開是首頁問題的解決方法

    這篇文章主要為大家詳細(xì)介紹了vue微信分享出來的鏈接點開是首頁問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11

最新評論