欧美亚洲自拍偷拍_日本一区视频在线观看_国产二区在线播放_亚洲男人第一天堂

二維碼
企資網

掃一掃關注

當前位置: 首頁 » 企資快訊 » 匯總 » 正文

終于徹底搞懂_Watch_WatchEffec

放大字體  縮小字體 發布日期:2022-12-12 05:42:21    作者:江造培    瀏覽次數:104
導讀

曾經以為自己會用 watch 、 watchEffect 了,后來發現只是略懂皮毛。最近我就把 Vue3 得偵聽器全面梳理了一下,分享給大家。看看有沒有你不會得吧,一起學起來!Watch基本用法當我們需要在數據變化時執行一些“副作

曾經以為自己會用 watch 、 watchEffect 了,后來發現只是略懂皮毛。最近我就把 Vue3 得偵聽器全面梳理了一下,分享給大家。看看有沒有你不會得吧,一起學起來!

Watch

基本用法

當我們需要在數據變化時執行一些“副作用”:如更改 DOM、執行異步操作,我們可以使用 watch 函數:

<script setup>import { ref, watch } from 'vue'const question = ref('')const answer = ref('This is answer. ;-)')// 偵聽一個 refwatch(question, async (newQuestion, oldQuestion) => { answer.value = 'Thinking...' const res = await fetch('...') answer.value = (await res.json()).answer})</script><template> <input v-model="question" /> <p>{{ answer }}</p></template>

watch() 一共可以接受三個參數,偵聽數據源、回調函數和配置選項。

偵聽數據源

watch 得第壹個參數可以是不同形式得“數據源”,它可以是:

  • 一個 ref
  • 一個計算屬性
  • 一個 getter 函數(有返回值得函數)
  • 一個響應式對象
  • 以上類型得值組成得數組

    const x = ref(1)const y = ref(1)const doubleX = computed(() => x.value * 2)const obj = reactive({ count: 0 })// 單個 refwatch(x, (newValue) => { console.log(`x is ${newValue}`)})// 計算屬性watch(doubleX, (newValue) => { console.log(`doubleX is ${newValue}`)})// getter 函數watch( () => x.value + y.value, (sum) => { console.log(`sum of x + y is: ${sum}`) })// 響應式對象watch(obj, (newValue, oldValue) => { // 在嵌套得屬性變更時觸發 // 注意:`newValue` 此處和 `oldValue` 是相等得 // 因為它們是同一個對象!})// 以上類型得值組成得數組watch([x, () => y.value], ([newX, newY]) => { console.log(`x is ${newX} and y is ${newY}`)})

    注意,你不能直接偵聽響應式對象得屬性值,例如:

    const obj = reactive({ count: 0 })// 錯誤,因為 watch() 得到得參數是一個 numberwatch(obj.count, (count) => { console.log(`count is: ${count}`)})

    這里需要用一個返回該屬性得 getter 函數:

    // 提供一個 getter 函數watch( () => obj.count, (count) => { console.log(`count is: ${count}`) })

    回調函數

    watch 得第二個參數是數據發生變化時執行得回調函數。

    這個回調函數接受三個參數:新值、舊值,以及一個用于清理副作用得回調函數。該回調函數會在副作用下一次執行前調用,可以用來清除無效得副作用,如等待中得異步請求:

    const id = ref(1)const data = ref(null)watch(id, async (newValue, oldValue, onCleanup) => { const { response, cancel } = doAsyncWork(id.value) // `cancel` 會在 `id` 更改時調用 // 以便取消之前未完成得請求 onCleanup(cancel) data.value = await response.json()})

    watch 得返回值是一個用來停止該副作用得函數:

    const unwatch = watch(() => {})// ...當該偵聽器不再需要時unwatch()

    注意:使用同步語句創建得偵聽器,會自動綁定到宿主組件實例上,并且會在宿主組件卸載時自動停止。使用異步回調創建一個偵聽器,則不會綁定到當前組件上,你必須手動停止它,以防內存泄漏。如下面這個例子:

    <script setup>import { watchEffect } from 'vue'// 組件卸載會自動停止watchEffect(() => {})// 組件卸載不會停止!setTimeout(() => { watchEffect(() => {})}, 100)</script>

    配置選項

    watch 得第三個參數是一個可選得對象,支持以下選項:

  • immediate:在偵聽器創建時立即觸發回調。
  • deep:深度遍歷,以便在深層級變更時觸發回調。
  • flush:回調函數得觸發時機。pre:默認,dom 更新前調用,post: dom 更新后調用,sync 同步調用。
  • onTrack / onTrigger:用于調試得鉤子。在依賴收集和回調函數觸發時被調用。

    深層偵聽器

    直接給 watch() 傳入一個響應式對象,會默認創建一個深層偵聽器 —— 所有嵌套得屬性變更時都會被觸發:

    const obj = reactive({ count: 0 })watch(obj, (newValue, oldValue) => { // 在嵌套得屬性變更時觸發 // 注意:`newValue` 此處和 `oldValue` 是相等得 // 因為它們是同一個對象!})obj.count++

    相比之下,一個返回響應式對象得 getter 函數,只有在對象被替換時才會觸發:

    const obj = reactive({ someString: 'hello', someObject: { count: 0 }})watch( () => obj.someObject, () => { // 僅當 obj.someObject 被替換時觸發 })

    當然,你也可以顯式地加上 deep 選項,強制轉成深層偵聽器:

    watch( () => obj.someObject, (newValue, oldValue) => { // `newValue` 此處和 `oldValue` 是相等得 // 除非 obj.someObject 被整個替換了 console.log('deep', newValue.count, oldValue.count) }, { deep: true })obj.someObject.count++ // deep 1 1

    深層偵聽一個響應式對象或數組,新值和舊值是相等得。為了解決這個問題,我們可以對值進行深拷貝。

    watch( () => _.cloneDeep(obj.someObject), (newValue, oldValue) => { // 此時 `newValue` 此處和 `oldValue` 是不相等得 console.log('deep', newValue.count, oldValue.count) }, { deep: true })obj.someObject.count++ // deep 1 0

    注意:深層偵聽需要遍歷所有嵌套得屬性,當數據結構龐大時,開銷很大。所以我們要謹慎使用,并且留意性能。

    watchEffect

    watch() 是懶執行得:當數據源發生變化時,才會執行回調。但在某些場景中,我們希望在創建偵聽器時,立即執行一遍回調。當然使用 immediate 選項也能實現:

    const url = ref('...')const data = ref(null)async function fetchData() { const response = await fetch(url.value) data.value = await response.json()}// 立即執行一次,再偵聽 url 變化watch(url, fetchData, { immediate: true })

    可以看到 watch 用到了三個參數,我們可以用 watchEffect 來簡化上面得代碼。watchEffect 會立即執行一遍回調函數,如果這時函數產生了副作用,Vue 會自動追蹤副作用得依賴關系,自動分析出偵聽數據源。上面得例子可以重寫為:

    const url = ref('...')const data = ref(null)// 一個參數就可以搞定watchEffect(async () => { const response = await fetch(url.value) data.value = await response.json()})

    watchEffect 接受兩個參數,第壹個參數是數據發生變化時執行得回調函數,用法和 watch 一樣。第二個參數是一個可選得對象,支持 flush 和 onTrack / onTrigger 選項,功能和 watch 相同。

    注意:watchEffect 僅會在其同步執行期間,才追蹤依賴。使用異步回調時,只有在第壹個 await 之前訪問到得依賴才會被追蹤。

    watch vs. watchEffect

    watch 和 watchEffect 得主要功能是相同得,都能響應式地執行回調函數。它們得區別是追蹤響應式依賴得方式不同:

  • watch 只追蹤明確定義得數據源,不會追蹤在回調中訪問到得東西;默認情況下,只有在數據源發生改變時才會觸發回調;watch 可以訪問偵聽數據得新值和舊值。
  • watchEffect 會初始化執行一次,在副作用發生期間追蹤依賴,自動分析出偵聽數據源;watchEffect 無法訪問偵聽數據得新值和舊值。

    簡單一句話,watch 功能更加強大,而 watchEffect 在某些場景下更加簡潔。

    好得,今天得分享就到這里。不知道你是不是徹底搞懂 watch 、 watchEffect 了呢,歡迎在評論區留言!

    如果覺得有用,記得點贊支持一哈 ~

  •  
    (文/江造培)
    免責聲明
    本文僅代表作發布者:江造培個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

    粵ICP備16078936號

    微信

    關注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯系
    客服

    聯系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    欧美亚洲自拍偷拍_日本一区视频在线观看_国产二区在线播放_亚洲男人第一天堂

          9000px;">

                欧美在线观看18| 激情六月婷婷综合| 久久精品国产成人一区二区三区| 国产一区二区三区黄视频| 一区二区视频在线| 美女视频第一区二区三区免费观看网站| 777色狠狠一区二区三区| 亚洲风情在线资源站| 香蕉久久一区二区不卡无毒影院| 欧美日韩亚洲另类| 777a∨成人精品桃花网| 亚洲国产综合91精品麻豆| 免费在线观看不卡| 色噜噜狠狠一区二区三区果冻| 欧美午夜一区二区| 欧美少妇bbb| 色综合久久精品| 精品少妇一区二区三区免费观看| 一区二区三区久久| 91精品国模一区二区三区| 久久久激情视频| 555www色欧美视频| 欧美日韩1234| 亚洲女厕所小便bbb| 成人午夜电影久久影院| 日韩精品电影一区亚洲| 日韩一区欧美二区| 成人一区二区三区视频| 欧美午夜影院一区| 亚洲精品免费在线播放| 中文字幕中文乱码欧美一区二区| 亚洲愉拍自拍另类高清精品| 成人午夜激情视频| 中文在线资源观看网站视频免费不卡| 视频一区欧美日韩| 成人app网站| 国产精品福利av| 国内精品免费在线观看| 欧美乱熟臀69xxxxxx| 亚洲成av人在线观看| 精一区二区三区| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | www.久久久久久久久| 国产欧美一区二区三区沐欲| 欧美亚洲国产bt| 中文字幕一区二区三| 琪琪久久久久日韩精品| 激情深爱一区二区| 亚洲色欲色欲www在线观看| 一本一道综合狠狠老| 天天做天天摸天天爽国产一区| 91美女视频网站| 亚洲成a人片在线观看中文| 日韩一级完整毛片| 成人免费视频一区二区| 亚洲成人精品在线观看| 777a∨成人精品桃花网| va亚洲va日韩不卡在线观看| 欧美日韩成人一区二区| 国产一区二区主播在线| 国产精品国产三级国产三级人妇| 中文字幕一区二区日韩精品绯色 | 国产精品正在播放| 亚洲资源中文字幕| 国产欧美在线观看一区| 亚洲日穴在线视频| 日韩欧美国产午夜精品| 国产主播一区二区三区| 日韩精品乱码免费| 亚洲色图视频网| 国产欧美日韩精品一区| 色乱码一区二区三区88| 在线观看视频91| 午夜一区二区三区在线观看| 精品国产亚洲一区二区三区在线观看| 精品一区二区三区不卡| 亚洲欧美激情一区二区| 国产无人区一区二区三区| 欧美日韩精品一区二区在线播放| 韩国成人在线视频| 国产欧美久久久精品影院| 欧美日韩国产乱码电影| 91网上在线视频| 色噜噜狠狠色综合欧洲selulu| 韩日欧美一区二区三区| 激情欧美一区二区| 欧美精品粉嫩高潮一区二区| 国产乱妇无码大片在线观看| 男男成人高潮片免费网站| 亚洲成人av一区二区| 亚洲图片欧美一区| 久久99国产精品免费网站| 日韩av网站在线观看| 久久91精品久久久久久秒播| 国产精品久久久久久久久免费樱桃 | av电影在线观看完整版一区二区| 在线不卡欧美精品一区二区三区| 色综合久久中文综合久久牛| 日韩精品一二三四| 91丨porny丨首页| 丰满少妇久久久久久久 | 99视频精品全部免费在线| 欧美综合欧美视频| 精品入口麻豆88视频| 亚洲欧美日本在线| 另类调教123区| 美国十次综合导航| 狠狠色狠狠色综合| 欧美系列亚洲系列| 26uuu另类欧美| 婷婷久久综合九色综合伊人色| 欧美a一区二区| 91在线一区二区三区| 欧美一区二区精美| 欧美性一区二区| 亚洲国产精品黑人久久久| 午夜欧美2019年伦理| 国产精品77777| 欧美三级日本三级少妇99| 国产精品久久久久久久午夜片| 亚洲18女电影在线观看| 欧美经典一区二区三区| 欧美电影免费观看高清完整版在线| 99re热这里只有精品视频| 国产麻豆91精品| 国产成人在线免费| 风流少妇一区二区| 成人激情小说乱人伦| 国产精品中文字幕日韩精品 | 日本一区二区三区四区在线视频 | 91久久线看在观草草青青| 国产99久久久精品| 高清国产午夜精品久久久久久| 欧美电影影音先锋| 色网站国产精品| 欧美日韩一区中文字幕| 欧美亚一区二区| 777奇米成人网| 精品精品国产高清a毛片牛牛 | 日本sm残虐另类| 欧美系列在线观看| 欧美精品久久一区| 日韩精品一区二区三区在线播放| 欧美一区二区免费视频| 精品一区二区三区影院在线午夜| 精品亚洲porn| 欧洲精品一区二区三区在线观看| 欧美日韩精品是欧美日韩精品| 欧美性淫爽ww久久久久无| 91精品婷婷国产综合久久性色 | 国产成人午夜片在线观看高清观看| 国产美女一区二区| 欧美亚洲综合色| 国产日产欧美一区| 欧美日本在线视频| 日本一区二区免费在线观看视频| 亚洲精品高清在线| 九九在线精品视频| 欧美在线视频全部完| 日本一区二区三区四区在线视频| 亚洲成人av中文| 最新热久久免费视频| 精品在线播放午夜| 日韩一级免费观看| 亚洲三级在线看| 91在线观看一区二区| 久久婷婷色综合| 国产精品久久久久aaaa樱花| 亚洲国产精品成人综合色在线婷婷 | 亚洲欧美另类小说视频| 99精品国产一区二区三区不卡| 日本在线不卡视频一二三区| 成人欧美一区二区三区视频网页 | 国产午夜精品久久久久久久 | 亚洲美女偷拍久久| 日本中文字幕不卡| 制服.丝袜.亚洲.另类.中文| 开心九九激情九九欧美日韩精美视频电影| 中文字幕一区日韩精品欧美| 成人深夜在线观看| 91精品在线免费| 91精品国产一区二区三区 | 精品福利一区二区三区免费视频| 美女久久久精品| 国产欧美一区二区在线| 成人a免费在线看| 欧美久久久久久久久中文字幕| 亚洲sss视频在线视频| 日韩免费高清电影| 成人app软件下载大全免费| 一二三四社区欧美黄| 一区二区三区中文免费| 日韩成人午夜精品| 久久久噜噜噜久久人人看| 91福利资源站| 婷婷久久综合九色综合绿巨人| 欧美岛国在线观看| 91麻豆国产精品久久| 麻豆一区二区99久久久久| 亚洲日本在线天堂|