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

一文詳解Vue響應式數(shù)據(jù)的原理

 更新時間:2023年08月13日 10:12:14   作者:小吳吳吳呀  
在vue2的響應式中,存在著添加屬性、刪除屬性、以及通過下標修改數(shù)組,但頁面不會自動更新的問題,而這些問題在vue3中都得以解決,本文就給大家詳細的介紹一下Vue響應式數(shù)據(jù)原理,感興趣的小伙伴跟著小編一起來看看吧

在 vue2 的響應式中,存在著添加屬性、刪除屬性、以及通過下標修改數(shù)組,但頁面不會自動更新的問題。而這些問題在 vue3 中都得以解決。

vue3 采用了 proxy 代理,用于攔截對象中任意屬性的變化,包括:屬性的讀寫、屬性的添加、屬性的刪除、以及通過下標修改數(shù)組,都可以自動更新頁面。

proxy 代理:用于在目標對象之前架設一層攔截,外界對該對象的訪問,都必須先通過這層攔截,因此可以對外界的訪問進行過濾和改寫。

另外 vue3 還采用了 reflect 反射,用于對源對象的屬性進行操作。

reflect 反射:是一個 JS 的內(nèi)置對象,它提供了一系列的方法,這些方法和對象中的功能相對應。經(jīng)常配合 proxy 使用。proxy 用于攔截,reflect 用于操作。

Proxy 代理的使用【代理對象】:

// 假設這個是我們創(chuàng)建的 reactive 數(shù)據(jù)
const data = {
  name: "張三",
  age: 21
};
// 創(chuàng)建 proxy 代理 data 對象,添加到 vue 的實例對象中
// 語法:const vm = new Proxy(要代理的數(shù)據(jù), 配置對象)
const vm = new Proxy(data, {
  // 當有人讀取 vm 的某個屬性時調(diào)用
  get(target, propName) {
	// target 就是被代理的這個對象,propName 就是當前操作的屬性
    console.log(`有人讀取了vm身上的${propName}屬性`);
    return target[propName]; // 返回代理對象中的這個屬性
  },
  // 當有人修改 vm 的某個屬性時,或給 vm 添加某個屬性時調(diào)用
  set(target, propName, value) {
	// value 就是修改的值
    console.log(`有人修改了vm身上的${propName}屬性,我要去更新頁面了!`);
    return (target[index] = value); // 修改或添加這個屬性
  },
  // 當有人刪除 vm 的某個屬性時調(diào)用
  deleteProperty(target, propName) {
    console.log(`有人刪除了vm身上的${propName}屬性,我要去更新頁面了!`);
    return delete target[propName]; // 刪除代理對象中的這個屬性
  },
});

注:proxy 不僅能檢測到讀取屬性和修改屬性,還能檢測到添加屬性和刪除屬性。所以在 vue3 中添加或刪除一個對象中的屬性時,頁面也會自動更新。

注:讀取時觸發(fā) get 函數(shù)、修改或添加時觸發(fā) set 函數(shù)、刪除時觸發(fā) deleteProperty 函數(shù)。

Proxy 代理的使用【代理數(shù)組】:

// 假設這個是我們創(chuàng)建的 reactive 數(shù)據(jù)
const arr = ["張三", "李四", "王五"];
// 創(chuàng)建 proxy 代理 arr 數(shù)組,添加到 vue 的實例對象中
// 語法:const app = new Proxy(要代理的數(shù)據(jù), 配置對象)
const app = new Proxy(arr, {
  // 當有人讀取 app 的某個值時調(diào)用
  get(target, index) {
    // target 就是被代理的這個數(shù)組,index 就是當前操作的屬性或下標
    console.log(`有人讀取了app身上下標${index}的值`);
    return target[index]; // 返回代理數(shù)組中的這個值
  },
  // 當有人修改 app 的某個值時,或給 app 添加一個值時調(diào)用
  set(target, index, value) {
    // value 就是修改的值
    console.log(`有人修改了app身上下標${index}的值,我要去更新頁面了!`);
    return (target[index] = value); // 修改或添加代理數(shù)組中的這個值
  },
  // 當有人刪除 app 的某個值時調(diào)用
  deleteProperty(target, index) {
    console.log(`有人刪除了app身上下標${index}的值,我要去更新頁面了!`);
    return delete target[index]; // 刪除代理數(shù)組中的這個值
  },
});

注:proxy 支持通過下標操作數(shù)組,例如查看數(shù)據(jù)、修改數(shù)據(jù)、增加數(shù)據(jù)。所以在 vue3 中通過下標修改數(shù)組時,頁面也會自動更新。

注:在使用 push 等方法的時候,length 屬性也會發(fā)生變化。所以 vue3 分別判斷了 push、pop、unshift、shift 等方法,用于區(qū)分攔截的各種情況。

Proxy 代理的使用【深層數(shù)據(jù)的問題】

const data = {
  name: "張三",
  age: 20,
  arr: ["a", "b", "c"],
  obj: { q: 1, w: 2 },
};
const app = new Proxy(data, {
  get(target, propName) {
    console.log(`有人讀取了app身上的${propName}屬性`);
    return target[propName];
  },
  set(target, propName, value) {
    console.log(`有人修改了app身上的${propName}屬性,我要去更新頁面了!`);
    return (target[propName] = value);
  },
  deleteProperty(target, propName) {
    console.log(`有人刪除了app身上的${propName}屬性,我要去更新頁面了!`);
    return delete target[propName];
  },
});

注:proxy 代理深層數(shù)據(jù)的時候,只會觸發(fā) get 函數(shù),并不會觸發(fā) set 函數(shù)

注:proxy 只會攔截第一層數(shù)據(jù),所以 vue3 對深層數(shù)據(jù)進行了循環(huán)遍歷,重新利用 proxy 代理了深層數(shù)據(jù)。

到此這篇關(guān)于一文詳解Vue響應式數(shù)據(jù)的原理的文章就介紹到這了,更多相關(guān)Vue響應式數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue如何添加數(shù)組頁面及時顯示

    vue如何添加數(shù)組頁面及時顯示

    這篇文章主要介紹了vue如何添加數(shù)組頁面及時顯示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • el-select單選時選擇后輸入框的is-focus狀態(tài)并沒有取消問題解決

    el-select單選時選擇后輸入框的is-focus狀態(tài)并沒有取消問題解決

    這篇文章主要給大家介紹了關(guān)于el-select單選時選擇后輸入框的is-focus狀態(tài)并沒有取消問題的解決過程,文中通過圖文以及代碼示例將解決的辦法介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • vue父子傳值,兄弟傳值,子父傳值詳解

    vue父子傳值,兄弟傳值,子父傳值詳解

    這篇文章主要介紹了Vue傳值-三種常用傳值示例,主要介紹了父組件向子組件進行傳值,子組件向父組件傳值和非父子組件進行傳值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • springboot+vue實現(xiàn)文件上傳下載

    springboot+vue實現(xiàn)文件上傳下載

    這篇文章主要為大家詳細介紹了springboot+vue實現(xiàn)文件上傳下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • vue項目實現(xiàn)便捷接入百度地圖API

    vue項目實現(xiàn)便捷接入百度地圖API

    部分項目需要地圖的嵌入,這篇文章主要介紹了vue項目中調(diào)用百度地圖API使用方法,其他的地圖調(diào)用與之類似,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-04-04
  • vue.js+elementUI實現(xiàn)點擊左右箭頭切換頭像功能(類似輪播圖效果)

    vue.js+elementUI實現(xiàn)點擊左右箭頭切換頭像功能(類似輪播圖效果)

    這篇文章主要介紹了vue.js+elementUI實現(xiàn)點擊左右箭頭切換頭像功能(類似輪播圖),本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • vue3中vite.config.js相關(guān)常用配置超詳細講解

    vue3中vite.config.js相關(guān)常用配置超詳細講解

    在Vue3項目中vite.config.js文件是Vite構(gòu)建工具的配置文件,它用于定義項目的構(gòu)建和開發(fā)選項,這篇文章主要介紹了vue3中vite.config.js相關(guān)常用配置的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • 一篇文章帶你搞懂Vue虛擬Dom與diff算法

    一篇文章帶你搞懂Vue虛擬Dom與diff算法

    這篇文章主要給大家介紹了關(guān)于Vue虛擬Dom與diff算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 淺析Proxy如何實現(xiàn)Vue響應式

    淺析Proxy如何實現(xiàn)Vue響應式

    這篇文章主要是來和大家探討一下,Vue的響應式系統(tǒng)僅僅是一個Proxy嗎,本文將圍繞此問題探索一下Proxy是如何實現(xiàn)Vue響應式的,感興趣的小伙伴可以了解一下
    2023-08-08
  • 詳解Vue中組件的緩存

    詳解Vue中組件的緩存

    這篇文章主要介紹了Vue中組件的緩存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04

最新評論