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

Vue3使用Proxy構(gòu)建高效響應(yīng)式數(shù)據(jù)的示例代碼

 更新時間:2025年03月04日 08:51:23   作者:奇舞精選  
在 Vue 3 中,Proxy 主要用于 攔截對象的基本操作,包括 屬性讀取(get)、修改(set)、刪除(deleteProperty) 等,本文給大家介紹了Vue3使用Proxy構(gòu)建高效響應(yīng)式數(shù)據(jù)的操作教程,需要的朋友可以參考下

Proxy 的核心機制

在 Vue 3 中,Proxy 主要用于 攔截對象的基本操作,包括 屬性讀?。╣et)、修改(set)、刪除(deleteProperty) 等。這是 Vue 3 取代 Object.defineProperty 的根本原因。

Proxy 允許攔截的操作:

操作作用
get(target, key, receiver)讀取屬性時觸發(fā)
set(target, key, value, receiver)設(shè)置屬性時觸發(fā)
deleteProperty(target, key)刪除屬性時觸發(fā)
has(target, key)判斷 key 是否存在(key in obj)
ownKeys(target)獲取對象的所有鍵(Object.keys(obj))
apply(target, thisArg, args)代理函數(shù)調(diào)用
construct(target, args)代理 new 操作符

Proxy 的核心實現(xiàn)

讓我們通過一個 手寫 Proxy 劫持 的例子,模擬 Vue 3 響應(yīng)式數(shù)據(jù)的基本實現(xiàn):

const handler = {
  get(target, key) {
    console.log(`讀取屬性:${key}`);
    return Reflect.get(target, key);
  },
  set(target, key, value) {
    console.log(`修改屬性:${key} -> ${value}`);
    return Reflect.set(target, key, value);
  }
};

const data = { message: "Hello Vue 3" };
const proxyData = new Proxy(data, handler);

console.log(proxyData.message); // 讀取屬性:message
proxyData.message = "Updated"; // 修改屬性:message -> Updated

解讀:

? • Reflect.get(target, key):用于獲取目標(biāo)對象的值,等價于 target[key]。

? • Reflect.set(target, key, value):用于修改目標(biāo)對象的值,等價于 target[key] = value。

? • Vue 3 就是基于 Proxy 設(shè)計 reactive() 來創(chuàng)建響應(yīng)式數(shù)據(jù)。

Vue 3 如何基于 Proxy 構(gòu)建響應(yīng)式系統(tǒng)

Vue 3 的核心響應(yīng)式 API reactive() 就是對 Proxy 的封裝,具體實現(xiàn)如下:

function reactive(target) {
  if (typeof target !== "object" || target === null) {
    return target;
  }

  return new Proxy(target, {
    get(target, key, receiver) {
      console.log(`訪問屬性:${key}`);
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      console.log(`修改屬性:${key} -> ${value}`);
      return Reflect.set(target, key, value, receiver);
    }
  });
}

const state = reactive({ count: 0 });

console.log(state.count); // 訪問屬性:count
state.count++; // 修改屬性:count -> 1

Vue 3 reactive() 實現(xiàn)的核心點

? 1. 使用 Proxy 劫持整個對象,而不是每個屬性。

? 2. 支持深層次代理(但 Vue 3 默認(rèn)是惰性代理,訪問時才創(chuàng)建嵌套對象的代理)。

? 3. 攔截數(shù)組和對象的方法(如 push、pop、delete) 。

Vue 3 的依賴收集與副作用處理機制

Vue 3 采用 “響應(yīng)式依賴收集 + 依賴觸發(fā)” 來完成視圖更新,核心組件包括:

? • reactive():創(chuàng)建響應(yīng)式數(shù)據(jù)(基于 Proxy)。

? • effect():收集依賴,記錄哪些屬性被訪問。

? • trigger():數(shù)據(jù)變更時通知所有依賴執(zhí)行。

1. Vue 3 依賴收集的核心實現(xiàn)

let activeEffect = null; // 當(dāng)前正在執(zhí)行的 effect
const targetMap = new WeakMap(); // 存儲依賴

function effect(fn) {
  activeEffect = fn;
  fn(); // 立即執(zhí)行一次,收集依賴
  activeEffect = null;
}

function track(target, key) {
  if (activeEffect) {
    let depsMap = targetMap.get(target);
    if (!depsMap) {
      depsMap = new Map();
      targetMap.set(target, depsMap);
    }
    let deps = depsMap.get(key);
    if (!deps) {
      deps = new Set();
      depsMap.set(key, deps);
    }
    deps.add(activeEffect);
  }
}

function trigger(target, key) {
  const depsMap = targetMap.get(target);
  if (!depsMap) return;
  const effects = depsMap.get(key);
  if (effects) {
    effects.forEach(fn => fn()); // 觸發(fā)所有依賴
  }
}

// 結(jié)合 Proxy 創(chuàng)建 Vue 3 響應(yīng)式對象
function reactive(target) {
  return new Proxy(target, {
    get(target, key, receiver) {
      track(target, key); // 依賴收集
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      const result = Reflect.set(target, key, value, receiver);
      trigger(target, key); // 觸發(fā)更新
      return result;
    }
  });
}

2. Vue 3 響應(yīng)式數(shù)據(jù)的完整示例

const state = reactive({ count: 0 });

effect(() => {
  console.log(`count 更新:${state.count}`);
});

state.count++; // 觸發(fā)更新:count 更新:1
state.count = 5; // 觸發(fā)更新:count 更新:5

執(zhí)行流程:

? 1. effect(() => console.log(state.count)) 執(zhí)行時,觸發(fā) get(),收集 state.count 的依賴。

? 2. state.count++ 觸發(fā) set(),調(diào)用 trigger() 通知所有依賴執(zhí)行 effect()。

Vue 3 Proxy 響應(yīng)式系統(tǒng)的優(yōu)化

1. 依賴按需收集

Vue 2 在初始化時遍歷整個對象,而 Vue 3 只有在 訪問屬性時才進(jìn)行代理,減少性能消耗。

2. 自動清理無效依賴

Vue 3 采用 WeakMap + Set 進(jìn)行依賴存儲,避免內(nèi)存泄漏,Vue 2 需要手動管理依賴刪除。

3. 只更新受影響的組件

Vue 3 的 trigger() 機制讓每個組件只更新它所依賴的部分,避免 Vue 2 中全局重新計算的問題。

總結(jié)

Proxy 使 Vue 3 的響應(yīng)式系統(tǒng)更高效,支持新增屬性監(jiān)聽、數(shù)組操作攔截等。依賴追蹤采用 WeakMap + Set 存儲,提高性能,避免 Vue 2 的內(nèi)存泄漏問題。 Vue 3 采用 Lazy Proxy(惰性代理),只有訪問屬性時才進(jìn)行代理,減少初始化開銷。Vue 3 的響應(yīng)式機制通過effect() 進(jìn)行自動依賴收集,讓數(shù)據(jù)更新更智能、更高效。

以上就是Vue3使用Proxy構(gòu)建高效響應(yīng)式數(shù)據(jù)的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Vue3 Proxy響應(yīng)式數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue3?setup的注意點及watch監(jiān)視屬性的六種情況分析

    Vue3?setup的注意點及watch監(jiān)視屬性的六種情況分析

    這篇文章主要介紹了Vue3?setup的注意點及watch監(jiān)視屬性的六種情況,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Electron進(jìn)程間通信的實現(xiàn)

    Electron進(jìn)程間通信的實現(xiàn)

    本文主要介紹了Electron進(jìn)程間通信的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Vue實現(xiàn)Tab選項卡切換

    Vue實現(xiàn)Tab選項卡切換

    這篇文章主要為大家詳細(xì)介紹了Vue實現(xiàn)Tab選項卡切換,點擊不同標(biāo)題顯示對應(yīng)圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue根據(jù)進(jìn)入的路由進(jìn)行原路返回的方法

    vue根據(jù)進(jìn)入的路由進(jìn)行原路返回的方法

    今天小編就為大家分享一篇vue根據(jù)進(jìn)入的路由進(jìn)行原路返回的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue深入解析之render function code詳解

    vue深入解析之render function code詳解

    vue對大家來說應(yīng)該再熟悉不過了,下面這篇文章主要給大家深入的解析了vue之render function code的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Vuejs 用$emit與$on來進(jìn)行兄弟組件之間的數(shù)據(jù)傳輸通信

    Vuejs 用$emit與$on來進(jìn)行兄弟組件之間的數(shù)據(jù)傳輸通信

    本篇文章主要介紹了Vuejs 用$emit 與 $on 來進(jìn)行兄弟組件之間的數(shù)據(jù)傳輸示例,非常具有實用價值,需要的朋友可以參考下。
    2017-02-02
  • vue中el-autocomplete支持分頁上拉加載功能

    vue中el-autocomplete支持分頁上拉加載功能

    最近在項目中使用了ElementUI的el-autocomplete,下面這篇文章主要介紹了vue中el-autocomplete支持分頁上拉加載功能的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • vue中@click和@click.native.prevent的區(qū)別

    vue中@click和@click.native.prevent的區(qū)別

    這篇文章主要介紹了vue中@click和@click.native.prevent的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • VUE引入使用G2圖表的實現(xiàn)

    VUE引入使用G2圖表的實現(xiàn)

    本文主要介紹了VUE引入使用G2圖表的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Vue表單之v-model綁定下拉列表功能

    Vue表單之v-model綁定下拉列表功能

    這篇文章主要介紹了Vue表單之v-model綁定下拉列表功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論

沂水县| 扶绥县| 南和县| 陵川县| 龙口市| 东乌| 丹东市| 汤阴县| 襄城县| 峡江县| 黄冈市| 新密市| 和林格尔县| 丽水市| 枞阳县| 南京市| 神池县| 南郑县| 泾源县| 汶川县| 永定县| 友谊县| 舟曲县| 剑河县| 龙山县| 正蓝旗| 香格里拉县| 浏阳市| 吴江市| 共和县| 安仁县| 敦煌市| 静安区| 梓潼县| 霍城县| 儋州市| 舟曲县| 镶黄旗| 望奎县| 金乡县| 平塘县|