亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

Vue 初始化過(guò)程

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

Object.defineProperty

來(lái)個(gè)簡(jiǎn)單的 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("你訪問(wèn)了" + key);//你訪問(wèn)了age
            return data[key];//20
          },
          set(newVal) {
            console.log("你設(shè)置了" + key); //你設(shè)置了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 對(duì)象的data/computed/props 中的數(shù)據(jù)規(guī)模龐大,那么遍歷起來(lái)就會(huì)慢很多.同理,如果 vue 對(duì)象的 data/computed/props 中的數(shù)據(jù)規(guī)模龐大,那么 Object.defineProperty 需要監(jiān)聽(tīng)所有的屬性的變化,那么占用內(nèi)存就會(huì)很大。

Proxy

我們來(lái)看看proxy

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

可以理解為在對(duì)象之前設(shè)置一個(gè)”攔截“,當(dāng)監(jiān)聽(tīng)的對(duì)象被訪問(wèn)的時(shí)候,都必須經(jīng)過(guò)這層攔截??梢栽谶@攔截中對(duì)原對(duì)象處理,返回需要的數(shù)據(jù)格式,也就是無(wú)論訪問(wèn)對(duì)象的什么屬性,之前定義的或是新增的屬性,都會(huì)走到攔截中進(jìn)行處理。這就解決了之前所無(wú)法監(jiān)聽(tīng)的問(wè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("設(shè)置的屬性為:" + 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);輸出結(jié)果為:設(shè)置的屬性為:age
新的屬性:age 值為:22查看的屬性為:age22

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • vue前端靈活改變后端地址兩種方式

    vue前端靈活改變后端地址兩種方式

    最近在學(xué)習(xí)或工作中遇到,把Vue前端項(xiàng)目打包后,要求可以再次修改請(qǐng)求后端接口的基礎(chǔ)地址,下面這篇文章主要給大家介紹了關(guān)于vue前端靈活改變后端地址的兩種方式,需要的朋友可以參考下
    2024-03-03
  • Vue前端vue.config.js簡(jiǎn)介

    Vue前端vue.config.js簡(jiǎn)介

    vue.config.js?是一個(gè)可選的配置文件,如果項(xiàng)目的?(和?package.json?同級(jí)的)?根目錄中存在這個(gè)文件,那么它會(huì)被?@vue/cli-service?自動(dòng)加載,本文重點(diǎn)介紹VUE前端vue.config.js簡(jiǎn)介,感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • echarts 使用formatter 修改鼠標(biāo)懸浮事件信息操作

    echarts 使用formatter 修改鼠標(biāo)懸浮事件信息操作

    這篇文章主要介紹了echarts 使用formatter 修改鼠標(biāo)懸浮事件信息操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Vue?內(nèi)置指令梳理總結(jié)

    Vue?內(nèi)置指令梳理總結(jié)

    這篇文章主要介紹了Vue?內(nèi)置指令梳理總結(jié),文章首先從v-text指令展開(kāi)內(nèi)容介紹,具有一定的知識(shí)性參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 在vue中使用Echarts利用watch做動(dòng)態(tài)數(shù)據(jù)渲染操作

    在vue中使用Echarts利用watch做動(dòng)態(tài)數(shù)據(jù)渲染操作

    這篇文章主要介紹了在vue中使用Echarts利用watch做動(dòng)態(tài)數(shù)據(jù)渲染操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • 詳解本地Vue項(xiàng)目請(qǐng)求本地Node.js服務(wù)器的配置方法

    詳解本地Vue項(xiàng)目請(qǐng)求本地Node.js服務(wù)器的配置方法

    本文只針對(duì)自己需要本地模擬接口于是搭建一個(gè)本地node服務(wù)器供自己測(cè)試使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • vue directive全局自定義指令實(shí)現(xiàn)按鈕級(jí)別權(quán)限控制的操作方法

    vue directive全局自定義指令實(shí)現(xiàn)按鈕級(jí)別權(quán)限控制的操作方法

    這篇文章主要介紹了vue directive全局自定義指令實(shí)現(xiàn)按鈕級(jí)別權(quán)限控制,本文結(jié)合實(shí)例代碼對(duì)基本概念做了詳細(xì)講解,需要的朋友可以參考下
    2023-02-02
  • Vue學(xué)習(xí)筆記進(jìn)階篇之單元素過(guò)度

    Vue學(xué)習(xí)筆記進(jìn)階篇之單元素過(guò)度

    這篇文章主要介紹了Vue學(xué)習(xí)筆記進(jìn)階篇之單元素過(guò)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 淺談vuex之mutation和action的基本使用

    淺談vuex之mutation和action的基本使用

    本篇文章主要介紹了淺談vuex之mutation和action的基本使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 解決vue單頁(yè)使用keep-alive頁(yè)面返回不刷新的問(wèn)題

    解決vue單頁(yè)使用keep-alive頁(yè)面返回不刷新的問(wèn)題

    下面小編就為大家分享一篇解決vue單頁(yè)使用keep-alive頁(yè)面返回不刷新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03

最新評(píng)論