最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue中的computed和watch的原理解析

 更新時(shí)間:2025年12月01日 09:10:13   作者:BUG 飼養(yǎng)員  
Vue的computed和watch都是響應(yīng)式系統(tǒng)的重要組成部分,computed通過依賴緩存提高性能,而watch用于監(jiān)聽數(shù)據(jù)變化并執(zhí)行副作用,兩者核心機(jī)制不同,而watch則是監(jiān)聽變化并觸發(fā)回調(diào),本文介紹Vue中的computed和watch的原理,感興趣的朋友跟隨小編一起看看吧

一、核心基礎(chǔ):響應(yīng)式系統(tǒng)支撐

computed與watch的實(shí)現(xiàn)均依賴Vue響應(yīng)式核心——依賴收集與觸發(fā)更新

  • 響應(yīng)式數(shù)據(jù)通過Object.defineProperty(Vue2)或Proxy(Vue3)劫持 getter/setter;
  • 讀取數(shù)據(jù)時(shí)收集依賴(記錄使用該數(shù)據(jù)的組件/計(jì)算屬性);
  • 修改數(shù)據(jù)時(shí)觸發(fā)setter,通知所有依賴執(zhí)行更新邏輯。

二者本質(zhì)是響應(yīng)式系統(tǒng)的“上層應(yīng)用”,差異在于對(duì)依賴變化的處理邏輯。

二、computed:帶緩存的依賴推導(dǎo)

2.1 核心原理:緩存+懶執(zhí)行

computed是“派生值”計(jì)算器,核心特性是依賴不變則復(fù)用緩存,避免重復(fù)計(jì)算:

  • 依賴收集:首次訪問computed時(shí),執(zhí)行其getter函數(shù),收集依賴的響應(yīng)式數(shù)據(jù);
  • 緩存結(jié)果:將計(jì)算結(jié)果緩存,標(biāo)記為“清潔”狀態(tài);
  • 懶更新:僅當(dāng)依賴數(shù)據(jù)變化時(shí),才標(biāo)記為“臟”狀態(tài),下次訪問時(shí)重新計(jì)算并更新緩存。

2.2 簡化實(shí)現(xiàn)代碼

// 模擬computed核心邏輯(Vue3風(fēng)格)
class ComputedRef {
  constructor(getter, ctx) {
    this.getter = getter; // 計(jì)算函數(shù)
    this.ctx = ctx; // 上下文
    this._value = null; // 緩存值
    this._dirty = true; // 臟標(biāo)記:true需重新計(jì)算
  }
  // 訪問computed時(shí)觸發(fā)
  get value() {
    if (this._dirty) {
      this._value = this.getter.call(this.ctx); // 執(zhí)行計(jì)算
      this._dirty = false; // 標(biāo)記為清潔
    }
    return this._value; // 復(fù)用緩存
  }
  // 依賴變化時(shí)調(diào)用
  markDirty() {
    this._dirty = true; // 標(biāo)記為臟
  }
}
// 實(shí)際使用
const count = ref(1);
// 計(jì)算屬性:依賴count
const doubleCount = new ComputedRef(() => count.value * 2, this);
console.log(doubleCount.value); // 2(計(jì)算并緩存)
console.log(doubleCount.value); // 2(直接復(fù)用緩存)
count.value = 2; // 觸發(fā)count的setter,調(diào)用doubleCount.markDirty()
console.log(doubleCount.value); // 4(重新計(jì)算)

三、watch:數(shù)據(jù)變化的副作用觸發(fā)器

3.1 核心原理:監(jiān)聽變化+執(zhí)行回調(diào)

watch是“數(shù)據(jù)監(jiān)聽器”,核心是監(jiān)聽指定數(shù)據(jù)源變化,觸發(fā)自定義副作用(如異步請(qǐng)求、DOM操作),支持深度監(jiān)聽和立即執(zhí)行。

3.2 關(guān)鍵特性與實(shí)現(xiàn)

// 模擬watch核心邏輯(Vue3風(fēng)格)
function watch(source, callback, options = {}) {
  const { immediate = false, deep = false } = options;
  let oldValue;
  // 1. 初始化:獲取初始值
  const getInitialValue = () => {
    // 深度監(jiān)聽時(shí)遞歸收集對(duì)象所有屬性依賴
    if (deep && isObject(source.value)) {
      traverse(source.value);
    }
    return source.value;
  };
  // 2. 副作用函數(shù):數(shù)據(jù)變化時(shí)執(zhí)行
  const effectFn = () => {
    const newValue = source.value;
    callback(newValue, oldValue); // 觸發(fā)回調(diào)
    oldValue = newValue;
  };
  // 3. 立即執(zhí)行(immediate為true時(shí))
  if (immediate) {
    oldValue = getInitialValue();
    effectFn();
  } else {
    oldValue = getInitialValue();
  }
  // 4. 關(guān)聯(lián)響應(yīng)式數(shù)據(jù):依賴變化時(shí)觸發(fā)effectFn
  effect(effectFn, { lazy: false });
}
// 實(shí)際使用
const user = reactive({ name: '張三', age: 20 });
// 監(jiān)聽user.age,支持深度監(jiān)聽
watch(
  () => user.age,
  (newAge, oldAge) => {
    console.log(`年齡從${oldAge}變?yōu)?{newAge}`);
  },
  { immediate: true, deep: false }
);

深度監(jiān)聽(deep: true)通過遞歸遍歷對(duì)象屬性實(shí)現(xiàn),會(huì)收集所有子屬性依賴,性能消耗較高,非必要不使用。

四、核心差異與適用場景

維度computedwatch
核心機(jī)制依賴推導(dǎo),緩存結(jié)果監(jiān)聽變化,觸發(fā)副作用
緩存特性有緩存,依賴不變不計(jì)算無緩存,變化即觸發(fā)
返回值必須返回值(派生數(shù)據(jù))無需返回值(執(zhí)行操作)
適用場景數(shù)據(jù)格式化、多值計(jì)算(如總價(jià)=單價(jià)×數(shù)量)異步操作、數(shù)據(jù)變化后的復(fù)雜邏輯(如刷新列表)

五、實(shí)戰(zhàn)避坑要點(diǎn)

  • computed避免副作用:getter中不可執(zhí)行異步操作或修改DOM,否則會(huì)破壞緩存邏輯和響應(yīng)式追蹤。
  • watch精簡監(jiān)聽源:盡量監(jiān)聽具體屬性(如()=>user.age)而非整個(gè)對(duì)象,減少深度監(jiān)聽的性能損耗。
  • Vue3注意點(diǎn):watch監(jiān)聽reactive對(duì)象時(shí),默認(rèn)開啟深度監(jiān)聽;監(jiān)聽ref時(shí)需通過.value訪問。
  • 緩存失效場景:computed依賴非響應(yīng)式數(shù)據(jù)(如普通變量)時(shí),數(shù)據(jù)變化不會(huì)觸發(fā)重新計(jì)算。

到此這篇關(guān)于Vue中的computed和watch的原理解析的文章就介紹到這了,更多相關(guān)vue computed和watch原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3在setup中使用mapState解讀

    vue3在setup中使用mapState解讀

    這篇文章主要介紹了vue3在setup中使用mapState方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue實(shí)現(xiàn)搜索并高亮文字的兩種方式總結(jié)

    vue實(shí)現(xiàn)搜索并高亮文字的兩種方式總結(jié)

    在做文字處理的項(xiàng)目時(shí)經(jīng)常會(huì)遇到搜索文字并高亮的需求,常見的實(shí)現(xiàn)方式有插入標(biāo)簽和貼標(biāo)簽兩種,這兩種方式適用于不同的場景,各有優(yōu)劣,下面我們就來看看他們的具體實(shí)現(xiàn)吧
    2023-11-11
  • Vue3使用el-table組件實(shí)現(xiàn)分頁、多選以及回顯功能

    Vue3使用el-table組件實(shí)現(xiàn)分頁、多選以及回顯功能

    這篇文章主要介紹了Vue3使用el-table組件實(shí)現(xiàn)分頁、多選以及回顯功能,文中通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-09-09
  • Vue基礎(chǔ)配置講解

    Vue基礎(chǔ)配置講解

    在本篇文章里小編給大家整理的是關(guān)于Vue基礎(chǔ)配置講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2019-11-11
  • Vue echarts 實(shí)現(xiàn)離線中國地圖的示例代碼(細(xì)化到省份)

    Vue echarts 實(shí)現(xiàn)離線中國地圖的示例代碼(細(xì)化到省份)

    這篇文章主要介紹了Vue echarts 實(shí)現(xiàn)離線中國地圖,細(xì)化到省份,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Vue打包工具(構(gòu)建工具)和腳手架過程

    Vue打包工具(構(gòu)建工具)和腳手架過程

    文章介紹了Vue項(xiàng)目中Webpack和Vite的使用區(qū)別,Webpack需vue-cli全局安裝,適合復(fù)雜場景;Vite更輕量快速,適合Vue3項(xiàng)目,并提到尤雨溪團(tuán)隊(duì)新推出的VoidZero技術(shù)布局
    2025-08-08
  • vue3中使用scss加上scoped導(dǎo)致樣式失效問題

    vue3中使用scss加上scoped導(dǎo)致樣式失效問題

    這篇文章主要介紹了vue3中使用scss加上scoped導(dǎo)致樣式失效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 完美解決axios在ie下的兼容性問題

    完美解決axios在ie下的兼容性問題

    下面小編就為大家分享一篇完美解決axios在ie下的兼容性問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vuex進(jìn)階知識(shí)點(diǎn)鞏固

    vuex進(jìn)階知識(shí)點(diǎn)鞏固

    本片文章是小編在網(wǎng)上整理的關(guān)于VUEX進(jìn)階的相關(guān)知識(shí)點(diǎn)內(nèi)容,對(duì)此有興趣的朋友可以跟著學(xué)習(xí)參考下。
    2018-05-05
  • 基于Vue-cli快速搭建項(xiàng)目的完整步驟

    基于Vue-cli快速搭建項(xiàng)目的完整步驟

    這篇文章主要給大家介紹了關(guān)于如何基于Vue-cli快速搭建項(xiàng)目的完整步驟,文中通過示例代碼以及圖片將搭建的步驟一步步介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評(píng)論

铅山县| 法库县| 崇左市| 勐海县| 沂南县| 集安市| 湖州市| 灵丘县| 南溪县| 汾阳市| 乐山市| 稷山县| 泾源县| 穆棱市| 广汉市| 大名县| 湖北省| 渝中区| 来凤县| 河西区| 四子王旗| 三穗县| 沅陵县| 赣榆县| 青川县| 临夏县| 慈溪市| 江山市| 绥滨县| 衡南县| 华安县| 肥西县| 沈丘县| 临江市| 东丽区| 大荔县| 资兴市| 靖边县| 巫山县| 恩平市| 辉南县|