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

Vue3?Watch踩坑實(shí)戰(zhàn)之watch監(jiān)聽無效

 更新時間:2023年05月08日 10:15:19   作者:qq_40441489  
Vue.js中的watch選項(xiàng)用于監(jiān)聽Vue實(shí)例上某個特定的數(shù)據(jù)變化,下面這篇文章主要給大家介紹了關(guān)于Vue3?Watch踩坑實(shí)戰(zhàn)之watch監(jiān)聽無效的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

ref 與 reactive

ref函數(shù)和reactive函數(shù)都是用來定義響應(yīng)式數(shù)據(jù)

但是reactive更適合定義引用類型、ref適合定義基本數(shù)據(jù)類型(可接收基本數(shù)據(jù)類型和對象)

reactive

1、 深層次響應(yīng)式,本質(zhì)是將傳入的數(shù)據(jù)包裝成一個Proxy對象

2、 參數(shù)必須是對象或者數(shù)組,如果要讓對象的某個元素實(shí)現(xiàn)響應(yīng)式時,需要使用toRefs,這樣每個都需要采用value方式訪問

ref

1、函數(shù)參數(shù)可以是基本數(shù)據(jù)類型,也可以接受對象類型

2、如果參數(shù)是對象類型時,其實(shí)底層的本質(zhì)還是reactive

3、ref響應(yīng)式原理是依賴于Object.defineProperty()的get()和set()的

watch

在自身組件監(jiān)聽 reactive 對象

let a = reactive({test: 123, bg: 456, hh: {hhh: 78}})
// 定時器 1
setTimeout(() => {
  a.test = 456
}, 2000)
// 定時器 2
setTimeout(() => {
  a.hh.hhh = 56 
}, 4000)
// 定時器 3
setTimeout(() => {
  a = {}  
}, 6000)
// 
watch(a, () => {
  // 定時器1, 2 可以觸發(fā)監(jiān)聽, 不需要deep也可以
  // 定時器3 不能觸發(fā)監(jiān)聽, 因?yàn)閷ο蟮牡刂芬呀?jīng)發(fā)生改變了
  console.log("change")
})
// 函數(shù)返回方式 采用deep可以監(jiān)聽, 不加deep不能監(jiān)聽 
watch(
  () => a,
  () => {
    console.log(" func change")
  },
  {
     deep: true
  }
)

為什么不加 deep不能監(jiān)聽呢,直接從源碼看

  function watch(source, cb, options) {
    if (!isFunction(cb)) {
      warn2(
        `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`
      );
    }
    return doWatch(source, cb, options);
  }
function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) {
  // 代碼不完整,截取部分
  ... 
   if (isRef(source)) {
      getter = () => source.value;
      forceTrigger = isShallow(source);
    } else if (isReactive(source)) {
      // 這里 ,如果 source 是 reactive
      // 則 deep = true 
      // 而 deep 為true 后面會 執(zhí)行traverse
      getter = () => source;
      deep = true;
    } else if (isArray(source)) {
      isMultiSource = true;
      forceTrigger = source.some((s) => isReactive(s) || isShallow(s));
      getter = () => source.map((s) => {
        if (isRef(s)) {
          return s.value;
        } else if (isReactive(s)) {
          return traverse(s);
        } else if (isFunction(s)) {
          return callWithErrorHandling(s, instance, 2 /* WATCH_GETTER */);
        } else {
          warnInvalidSource(s);
        }
      });
    } else if (isFunction(source)) {
      // 如果是函數(shù),
      //最終 getter () => fn()
      // deep為false,因此不走 traverse()
      if (cb) {
        getter = () => callWithErrorHandling(source, instance, 2 /* WATCH_GETTER */);
      } else {
        getter = () => {
          if (instance && instance.isUnmounted) {
            return;
          }
          if (cleanup) {
            cleanup();
          }
          return callWithAsyncErrorHandling(
            source,
            instance,
            3 /* WATCH_CALLBACK */,
            [onCleanup]
          );
        };
      }
    } else {
      getter = NOOP;
      warnInvalidSource(source);
    }
    ....
    if (cb && deep) {
      const baseGetter = getter;
      getter = () => traverse(baseGetter());
    }
}

traverse 深度遍歷整個對象,深層次的訪問其所有的響應(yīng)式變量,并收集依賴

在自身組件監(jiān)聽 ref 對象

let a = ref({test: 123, bg: 456, hh: {hhh: 78}})
setTimeout(() => {
  a.value.test = 456
}, 2000)
setTimeout(() => {
  a.value.hh.hhh = 56
}, 4000)
setTimeout(() => {
  a.value = {}
}, 6000)
// 注意下面兩種寫法 一個是 a , 一個是 a.value
// 從源碼可知, 如果是 a, 那么走isRef(source)分支, 如果是 a.value 那么走 isReactive(分支)
// 這里不給出結(jié)果,動手試試
watch(a.value, (val) => {
  console.log(val, "change")
})
watch(a, (val) => {
  console.log(val, "change")
})
// 如果是 函數(shù)返回的方式呢? 其實(shí)也分兩種,類推即可,同時也需要注意是否需要加 deep 屬性
watch(() => a.value, (val) => {
  console.log(val, "change")
})
watch(() => a, (val) => {
  console.log(val, "change")
})

如果在子組件需要監(jiān)聽父組件的數(shù)據(jù),同時父組件可以通過v-model雙向綁定時需要非常注意,不然可能出現(xiàn)一些bug

如果watch監(jiān)聽無效,根據(jù)你的數(shù)據(jù)結(jié)構(gòu)分析是否是因?yàn)閷懛ú徽_導(dǎo)致。

總結(jié)

到此這篇關(guān)于Vue3 Watch踩坑實(shí)戰(zhàn)之watch監(jiān)聽無效的文章就介紹到這了,更多相關(guān)Vue3 watch監(jiān)聽無效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于vue-tree-chart簡單的使用

    關(guān)于vue-tree-chart簡單的使用

    這篇文章主要介紹了關(guān)于vue-tree-chart簡單的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue實(shí)現(xiàn)多標(biāo)簽選擇器

    Vue實(shí)現(xiàn)多標(biāo)簽選擇器

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)多標(biāo)簽選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • vue3中使用swiper的完整版教程(超詳細(xì)!)

    vue3中使用swiper的完整版教程(超詳細(xì)!)

    工作中日常筆記,vue中使用swiper插件,在pc端和h5端也是常用的插件,下面這篇文章主要給大家介紹了關(guān)于vue3中使用swiper的完整版教程,需要的朋友可以參考下
    2023-04-04
  • 通過vue手動封裝on、emit、off的代碼詳解

    通過vue手動封裝on、emit、off的代碼詳解

    這篇文章主要介紹了通過vue手動封裝on,emit,off的代碼詳解,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • 在vue中實(shí)現(xiàn)跨域方法小結(jié)

    在vue中實(shí)現(xiàn)跨域方法小結(jié)

    在Web開發(fā)中,跨域問題是一大挑戰(zhàn),跨域是指網(wǎng)絡(luò)請求從一個域名發(fā)起,而請求的目標(biāo)資源位于另一個不同的域名下,通常使用Vue CLI的代理來解決跨域問題,而在生產(chǎn)環(huán)境中,可以通過后端配置CORS或使用Nginx反向代理,或者通過服務(wù)器中轉(zhuǎn)來解決跨域問題
    2023-10-10
  • Vue?Token過期問題的2種解決方案小結(jié)

    Vue?Token過期問題的2種解決方案小結(jié)

    在使用token進(jìn)行登錄的過程中,如果token過期了,需要重新輸入用戶名和密碼登錄,這種體驗(yàn)肯定是不好的,下面這篇文章主要給大家介紹了關(guān)于Vue?Token過期問題的2種解決方案,需要的朋友可以參考下
    2023-02-02
  • vue中的數(shù)據(jù)格式化filters、formatter方式

    vue中的數(shù)據(jù)格式化filters、formatter方式

    這篇文章主要介紹了vue中的數(shù)據(jù)格式化filters、formatter方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Vue-cli3 $ is not defined錯誤問題及解決

    Vue-cli3 $ is not defined錯誤問題及解決

    這篇文章主要介紹了Vue-cli3 $ is not defined錯誤問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 在Vue3中為路由Query參數(shù)標(biāo)注類型的方法

    在Vue3中為路由Query參數(shù)標(biāo)注類型的方法

    這篇文章主要介紹了在Vue3中如何為路由Query參數(shù)標(biāo)注類型,我們就針對這個話題如何為路由Query參數(shù)標(biāo)注類型為例,看看Composable和IOC容器的代碼風(fēng)格究竟有什么不同,需要的朋友可以參考下
    2024-08-08
  • Vue項(xiàng)目el-upload?上傳文件及回顯照片和下載文件功能實(shí)現(xiàn)

    Vue項(xiàng)目el-upload?上傳文件及回顯照片和下載文件功能實(shí)現(xiàn)

    本次需求是上傳多種固定格式的文件,且回顯的時候,圖片可以正常顯示,文件可以進(jìn)行下載,主要采用element的el-upload組件實(shí)現(xiàn),對Vue項(xiàng)目el-upload?上傳文件及回顯照片和下載文件功能實(shí)現(xiàn)感興趣的朋友跟隨小編一起看看吧
    2023-12-12

最新評論