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

Vue3使用Proxy實現(xiàn)數(shù)據(jù)監(jiān)聽的原因分析

 更新時間:2021年11月16日 08:34:47   作者:jszja  
在本篇文章里小編給大家整理的是一篇關于Vue3使用Proxy實現(xiàn)數(shù)據(jù)監(jiān)聽的原因分析內容,有需要的朋友們可以跟著學習參考下。

vue 數(shù)據(jù)雙向綁定原理,而這個方法有缺點,并且不能實現(xiàn)數(shù)組和對象的部分監(jiān)聽情況;具體也可以看我之前寫的一篇博客: 關于 Vue 不能 watch 數(shù)組 和 對象變化的解決方案,最新的 Proxy,相比 vue2 的 Object.defineProperty,能達到速度加倍、內存減半的成效。具體是怎么實現(xiàn)、以及對比舊的實現(xiàn)方法為啥能有速度加倍、內存減半的特性,下面我們來聊聊:

Vue 初始化過程

Vue 的初始化過程,分別有Observer、Compiler和Watcher,當我們 new Vue 的時候,會調用Observer,通過 Object.defineProperty 遍歷 vue 對象的 data、computed 或者 props(如果是組件的話)的所有屬性進行監(jiān)聽。同時通過Compiler解析模板指令,解析到屬性后就 new 一個Watcher并綁定更新函數(shù)到 watcher 當中,Observer 和 Compiler 就通過屬性來進行關聯(lián)。

Object.defineProperty

來個簡單的 Object.defineProperty例子

class Observer {
    constructor(data) {
      // 遍歷參數(shù) data 的屬性,給添加到 this 上
      for (let key of Object.keys(data)) {
        if (typeof data[key] === "object") {
          data[key] = new Observer(data[key]);
        }
        Object.defineProperty(this, key, {
          enumerable: true,
          configurable: true,
          get() {
            console.log("你訪問了" + key);//你訪問了age
            return data[key];//20
          },
          set(newVal) {
            console.log("你設置了" + key); //你設置了age
            console.log("新的" + key + "=" + newVal); //新的age=20
            if (newVal === data[key]) {
              return;
            }
            data[key] = newVal;
          }
        });
      }
    }
  }const obj = {
    name: "app",
    age: "18",
    a: {
      b: 1,
      c: 2,
    }
  };const app = new Observer(obj);app.age = 20;console.log(app.age);app.newPropKey = "新屬性";console.log(app.newPropKey);    //新屬性

從上面可以知道:Object.defineProperty 需要遍歷所有的屬性,這就造成了如果 vue 對象的data/computed/props 中的數(shù)據(jù)規(guī)模龐大,那么遍歷起來就會慢很多.同理,如果 vue 對象的 data/computed/props 中的數(shù)據(jù)規(guī)模龐大,那么 Object.defineProperty 需要監(jiān)聽所有的屬性的變化,那么占用內存就會很大。

Proxy

我們來看看proxy

Proxy 對象用于定義基本操作的自定義行為(如屬性查找,賦值,枚舉,函數(shù)調用等)

可以理解為在對象之前設置一個”攔截“,當監(jiān)聽的對象被訪問的時候,都必須經過這層攔截。可以在這攔截中對原對象處理,返回需要的數(shù)據(jù)格式,也就是無論訪問對象的什么屬性,之前定義的或是新增的屬性,都會走到攔截中進行處理。這就解決了之前所無法監(jiān)聽的問題。

const obj = {
  name: "krry",
  age: 24,
  others: {
    mobile: "mi10",
    watch: "mi4",
  },};const p = new Proxy(obj, {
  get(target, key, receiver) {
    console.log("查看的屬性為:" + key);  
    return Reflect.get(target, key, receiver);
  },
  set(target, key, value, receiver) {
    console.log("設置的屬性為:" + key); 
    console.log("新的屬性:" + key, "值為:" + value); 
    Reflect.set(target, key, value, receiver);
  },});p.age = 22;console.log(p.age); p.single = "NO";console.log(p.single);p.others.shoe = "boost";console.log(p.others.shoe);輸出結果為:設置的屬性為:age
新的屬性:age 值為:22查看的屬性為:age22

設置的屬性為:single
新的屬性:single 值為:NO查看的屬性為:singleNO 查看的屬性為:others
查看的屬性為:others
boost

由上可知,新增或編輯屬性,并不需要重新添加響應式處理,都能監(jiān)聽的到,因為 Proxy 是對對象的操作,只要你訪問對象,就會走到 Proxy 的邏輯中。Reflect 是一個內置的對象,它提供攔截 JavaScript 操作的方法。這些方法與proxy handlers的方法相同。Reflect不是一個函數(shù)對象,因此它是不可構造的,區(qū)別Proxy 和 Object.defineProperty 的使用方法看似很相似,其實 Proxy 是在更高維度上去攔截屬性的。

Object.definePropertyVue2 中,對于給定的 data:如 { count: 1 },是需要根據(jù)具體的 key 也就是 count,去對 get 和 set 進行攔截,也就是:

Object.defineProperty(data, 'count', {
  get() {},
  set() {},})

必須預先知道要攔截的 key 是什么,這也就是為什么 Vue2 里對于對象上的新增屬性無能為力,所以 Vue 初始化的過程中需要遍歷 data 來挾持數(shù)據(jù)變化,造成速度變慢,內存變大的原因。

Proxy 而 Vue3 所使用的 Proxy,則是這樣攔截的:

new Proxy(data, {
  get(key) { },
  set(key, value) { },})

可以看到,proxy 不需要關心具體的 key,它去攔截的是修改 data 上的任意 key和讀取 data 上的任意 key

所以,不管是已有的 key 還是新增的 key,都會監(jiān)聽到。

到此這篇關于Vue3使用Proxy實現(xiàn)數(shù)據(jù)監(jiān)聽的原因分析的文章就介紹到這了,更多相關Vue3為什么使用Proxy實現(xiàn)數(shù)據(jù)監(jiān)聽內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue實現(xiàn)在data里引入相對路徑

    vue實現(xiàn)在data里引入相對路徑

    這篇文章主要介紹了vue實現(xiàn)在data里引入相對路徑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • vue3?+?async-validator實現(xiàn)表單驗證的示例代碼

    vue3?+?async-validator實現(xiàn)表單驗證的示例代碼

    表單驗證可以有效的過濾不合格的數(shù)據(jù),減少服務器的開銷,并提升用戶的使用體驗,今天我們使用?vue3?來做一個表單驗證的例子,需要的朋友跟隨小編一起學習下吧
    2022-06-06
  • 基于Vue實現(xiàn)自定義組件的方式引入圖標

    基于Vue實現(xiàn)自定義組件的方式引入圖標

    在vue項目中我們經常遇到圖標,下面這篇文章主要給大家介紹了關于如何基于Vue實現(xiàn)自定義組件的方式引入圖標的相關資料,文章通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • 如何在vite初始化項目中安裝scss以及scss的使用

    如何在vite初始化項目中安裝scss以及scss的使用

    今天想要給vite項目,添加全局的scss變量文件引用,這樣我們在使用scss變量和函數(shù)的時候就不需要每個組件都取引用了,下面這篇文章主要給大家介紹了關于如何在vite初始化項目中安裝scss以及scss使用的相關資料,需要的朋友可以參考下
    2022-10-10
  • vue axios攔截器常用之重復請求取消

    vue axios攔截器常用之重復請求取消

    我們大家在開發(fā)中,經常會遇到接口重復請求導致的各種問題,下面這篇文章主要給大家介紹了關于axios攔截器之重復請求取消的相關資料,需要的朋友可以參考下
    2021-09-09
  • Vue實現(xiàn)點擊導航欄當前標簽后變色功能

    Vue實現(xiàn)點擊導航欄當前標簽后變色功能

    這篇文章主要為大家詳細介紹了Vue實現(xiàn)點擊導航欄當前標簽后變色功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • vue實現(xiàn)不定高虛擬列表的示例詳解

    vue實現(xiàn)不定高虛擬列表的示例詳解

    這篇文章主要為大家詳細介紹了在vue環(huán)境單頁面項目下,如何實現(xiàn)不定高虛擬列表,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • 基于vue2.0+vuex的日期選擇組件功能實現(xiàn)

    基于vue2.0+vuex的日期選擇組件功能實現(xiàn)

    這篇文章主要介紹了 基于vue2.0+vuex的日期選擇組件功能實現(xiàn),詳細介紹了使用vue編寫的日期組件,,非常具有實用價值,需要的朋友可以參考下。
    2017-03-03
  • Vue3按需引入Element?Plus以及定制主題色教程

    Vue3按需引入Element?Plus以及定制主題色教程

    由于涉及到vue框架單網頁應用首屏加載慢這個問題,我們需盡量減少加載負擔,故采用按需引入的方式,只引入項目中用到的組件,這篇文章主要給大家介紹了關于Vue3按需引入Element?Plus以及定制主題色的相關資料,需要的朋友可以參考下
    2023-06-06
  • Vue高級組件之函數(shù)式組件的使用場景與源碼分析

    Vue高級組件之函數(shù)式組件的使用場景與源碼分析

    Vue提供了一種稱為函數(shù)式組件的組件類型,用來定義那些沒有響應數(shù)據(jù),也不需要有任何生命周期的場景,它只接受一些props來顯示組件,下面這篇文章主要給大家介紹了關于Vue高級組件之函數(shù)式組件的使用場景與源碼分析的相關資料,需要的朋友可以參考下
    2021-11-11

最新評論

东光县| 双城市| 南部县| 隆化县| 邹城市| 五原县| 晋城| 吉林市| 呼和浩特市| 嘉祥县| 平邑县| 宁化县| 东阿县| 宜阳县| 清丰县| 阳新县| 厦门市| 新乡县| 胶州市| 闽清县| 台中县| 马公市| 务川| 卓尼县| 五指山市| 汉中市| 泸州市| 新巴尔虎左旗| 伊川县| 定州市| 隆回县| 翼城县| 合山市| 丹东市| 南丹县| 青冈县| 正安县| 呼和浩特市| 棋牌| 郎溪县| 克什克腾旗|