国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應式原理。

這篇具有很好參考價值的文章主要介紹了前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應式原理。。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、思考

Vue的響應式到底要干什么?

  • 無非就是要知道當你讀取對象的時候,要知道它讀了。要做一些別的事情
  • 無非就是要知道當你修改對象的時候,要知道它改了。要做一些別的事情
  • 所以要想一個辦法,把讀取和修改的動作變成一個函數(shù),讀取和修改的時候分別調(diào)用對應的函數(shù)
  • 在ES6之,只能通過Object.defineproperty 給它變成一個get和set函數(shù)。當讀取這個屬性的時候運行g(shù)et,修改這個屬性的時候運行set

  • 在ES6之后,就能通過Porxy去代理整個對象

2、Vue2的做法?

針對某個對象中某個屬性的做法

通過Object.defineProperty去針對某個對象的屬性去進行監(jiān)聽? ? ? ? ? ? ? ? ? ? ? ? ? ?

const obj = {
  a: 1,
  b: 2,
  c: {
    d: 3,
    e: 4,
  },
}

// 保存初始值
let v = obj.a

Object.defineProperty(obj, 'a', {
  get() {
    console.log('a', '讀取')
    return v
  },
  set(val) {
    // 當原來的值與重新賦值的值不一樣的時候才進行修改
    if (val !== v) {
      console.log('a', '更改了')
      v = val
    }
  },
})

當我們?nèi)?strong>讀取 obj.a 這個屬性的時候 get 函數(shù)?就會調(diào)用。

當我們?nèi)?strong>修改?obj.a 這個屬性的時候 set 函數(shù)?就會調(diào)用。

前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應式原理。,前端開發(fā)攻略,前端,javascript,vue.js

針對某個對象中多個屬性的做法

Vue2的源碼中,有一個函數(shù)叫做?observe(觀察器)。在這個函數(shù)中,去深度遍歷對象中的每一個屬性,給每一個屬性添加?Object.defineProperty,這樣就能對對象中的每一個屬性叫做監(jiān)聽。這個過程就叫做 觀察

const obj = {
  a: 1,
  b: 2,
  c: {
    d: 3,
    e: 4,
  },
}
// 輔助函數(shù) 判斷這個值是不是一個對象
function _isObject(v) {
  return typeof v === 'object' && v !== null
}
function observe(obj) {
  for (const k in obj) {
    let v = obj[k]
    // 如果這一個屬性仍然是一個對象的話,就需要深度遍歷
    if (_isObject(v)) {
      observe(v)
    }
    Object.defineProperty(obj, k, {
      get() {
        console.log(k, '讀取了')
        return v
      },
      set(val) {
        // 當原來的值與重新賦值的值不一樣的時候才進行修改
        if (val !== v) {
          console.log(k, '更改了')
          v = val
        }
      },
    })
  }
}
observe(obj)

當我們?nèi)?strong>讀取對象中的某個屬性的時候 get 函數(shù)?就會調(diào)用。

當我們?nèi)?strong>修改對象中的某個屬性的時候 set 函數(shù)?就會調(diào)用。

前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應式原理。,前端開發(fā)攻略,前端,javascript,vue.js

打印內(nèi)容解釋:

  • obj.a? =? 3? ?更改
  • obj.c.d? = 4? 先讀取 obj.c 的值,再更改?obj.c.d?的值
  • obj.c.e? ?先讀取 obj.c 的值,再讀取?obj.c.e?的值

總結(jié)

  1. 在Vue2里面觀察的方式就是?深度遍歷每一個屬性 把每一個屬性的讀取和賦值變成函數(shù)get和set。
  2. 在這種做法下有一個天生的缺陷,由于它是針對每個屬性的監(jiān)聽,所以就必須要進行深度的遍歷,這樣會有效率損失。?
  3. 由于在?observe(obj)?觀察這個步驟里邊完成了深度遍歷,也就是說在這個時間點里邊,這些屬性被我們監(jiān)聽到了都被改成get和set了
  4. 但是這一步一旦做完了之后。再去新增的話它就不知道了。比如 obj.qwertr = 3?對于這個屬性而言,它就是沒有監(jiān)聽的,因為監(jiān)聽的步驟已經(jīng)結(jié)束了

  5. 這就是為什么Vue2它無法監(jiān)聽屬性的新增,當然也包括屬性的刪除。它也收不到通知。因為在?Object.defineProperty 既不會運行g(shù)et也不會運行set

3、Vue3的做法

其實核心道理都是一樣的。無論是Vue2還是Vue3,都必須要把讀取和賦值變成函數(shù)。只不過Vue3變成函數(shù)的方式不一樣。在Vue3里面不會去對對象的每一個屬性進行監(jiān)聽了,而是直接監(jiān)聽整個對象。將來不管是在這個對象中添加還是刪除屬性都不怕了。因為監(jiān)聽的是整個對象,這要動了這個對象就能收到通知。

做法

Vue3使用的是Proxy

const obj = {
  a: 1,
  b: 2,
  c: {
    d: 3,
    e: 4,
  },
}

const proxy = new Proxy(obj, {
  // 讀這個對象的屬性的時候收到通知
  get(target, k) {
    // target就是obj,k是屬性名
    let v = target[k]
    console.log(k, '讀取')
    return v
  },
  // 修改這個對象的屬性的時候收到通知
  set(target, k, val) {
    // target就是obj,k是屬性名,val是新值
    if (target[k] !== val) {
      target[k] = val
      console.log(k, '更改')
      return target[k]
    }
  },
  // 刪除對象的屬性的時候收到通知
  deleteProperty(target, k, val) {
    console.log(k, '刪除')
    return target[k]
  },
})

會產(chǎn)生一個代理對象propx,將來去讀屬性也好,重新給屬性賦值也好都是通過這個代理對象去做的。

前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應式原理。,前端開發(fā)攻略,前端,javascript,vue.js

總結(jié)

  1. Proxy 對象可以直接代理整個對象,而不需要遍歷對象屬性進行劫持,這樣可以減少運行時的性能開銷。在 Vue 2 中,由于每個屬性都需要單獨設置 get?和 set,對于大量的屬性或嵌套屬性,這種劫持可能會導致性能下降。
  2. 另外,使用 Proxy 的方式更符合現(xiàn)代 JavaScript 的發(fā)展趨勢,更好地利用了 JavaScript 引擎的優(yōu)化。

4、總結(jié)

綜上所述,Vue 3 中使用 Proxy 對象代替了 Vue 2 中的?Object.defineProperty,帶來了更強大、更靈活和更高效的屬性攔截和代理功能,同時也提升了開發(fā)體驗和調(diào)試效率。這些改進使得 Vue 3 在處理 Props 的方式更加現(xiàn)代化和優(yōu)雅,提升了整體的性能和可維護性。文章來源地址http://www.zghlxwxcb.cn/news/detail-854516.html

到了這里,關于前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應式原理。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【前端開發(fā)工具】VUE3 devtools安裝

    【前端開發(fā)工具】VUE3 devtools安裝

    尤雨溪在2020年9月19日晚正式發(fā)布vue3.0 one piece。此版本相較于vue2版本,更快、更小、更易維護、更易于原生、讓開發(fā)者更輕松;所以學習vue3,對于一個前端開發(fā)者來說是一個刻不容緩的學習趨勢。 學習vue3自然也離不開debug啦~~ Vue官方發(fā)布了調(diào)試工具Vue-Devtools。 VUE3的Vue-Devt

    2024年02月05日
    瀏覽(90)
  • 從Vue2到Vue3, 一鍵升級前端開發(fā)技能

    本文的目的,是為了讓已經(jīng)有 Vue2 開發(fā)經(jīng)驗的 ? 人 ? ,快速掌握 Vue3 的寫法。 因此, ? 本篇假定你已經(jīng)掌握 Vue 的核心內(nèi)容 ? ,只為你介紹編寫 Vue3 代碼,需要了解的內(nèi)容。 首先,Vue3 新增了一個叫做組合式 api 的東西,英文名叫 Composition API 。因此 Vue3 的? script ?現(xiàn)在支

    2024年02月08日
    瀏覽(26)
  • Vue3前端開發(fā),computed計算屬性的基礎練習

    Vue3前端開發(fā),computed計算屬性的基礎練習

    Vue3前端開發(fā),computed計算屬性的基礎練習! 在新版里面,和傳統(tǒng)的vue2一樣,計算屬性,都是對一些數(shù)據(jù)運算進行了封裝操作。返回結(jié)果是一個實時監(jiān)控的效果。區(qū)別在于,寫法不同。效果是一樣。 下面給大家展示一個簡單的案例。 如圖,自定義一個組件,ComputedDemo.vue。里

    2024年01月18日
    瀏覽(19)
  • Vue3前端開發(fā),watch數(shù)據(jù)偵聽器的立即執(zhí)行

    Vue3前端開發(fā),watch數(shù)據(jù)偵聽器的立即執(zhí)行

    Vue3前端開發(fā),watch數(shù)據(jù)偵聽器的立即執(zhí)行!實際上,我們可以通過回調(diào)函數(shù)的后面,再追加一個對象,來設置這個參數(shù),immediate:true.來實現(xiàn)一種立即執(zhí)行的效果。在頁面記載完成后,馬上就會執(zhí)行一次watch. 如上所示,我們在回調(diào)函數(shù)的后面,追加了一個參數(shù),是一個對象類型

    2024年01月18日
    瀏覽(28)
  • Vue3前端開發(fā),父組件給子組件傳遞數(shù)據(jù)練習

    Vue3前端開發(fā),父組件給子組件傳遞數(shù)據(jù)練習

    Vue3前端開發(fā),父組件給子組件傳遞數(shù)據(jù)練習!還是借用剛剛的組件模板,來開展父傳子的練習。 依舊是需要借助官方提供的宏函數(shù)來接收數(shù)據(jù)。defineProps. 這個是父組件里面的內(nèi)容。我們自定義了2個變量,一個是車厘子單價。一個是純文本。 一個數(shù)字類型,一個文本類型。都

    2024年01月22日
    瀏覽(28)
  • vue3 + Tailwind Css + Vite 搭建快速開發(fā)前端樣式環(huán)境

    vue3 + Tailwind Css + Vite 搭建快速開發(fā)前端樣式環(huán)境

    一個功能類優(yōu)先的 CSS 框架,用于快速構(gòu)建定制的用戶界面。這是來自 TailwindCss 官方定義。 中文網(wǎng)站 Tailwindcss 基于原子化理念,將樣式重復性代碼降到最小,原本開發(fā)最大限度基于類名的聲明塊不重復,現(xiàn)在Tailwindcss基于單獨一句聲明不重復。 活躍度 github starts 數(shù)量達到

    2024年02月04日
    瀏覽(29)
  • vue3前端開發(fā),自學一下reactive,ref的差異是什么。

    vue3前端開發(fā),自學一下reactive,ref的差異是什么。

    vue3前端開發(fā),自學,學習一下,reactive和ref的差別。以及基礎用法。 前言,這2個東西,都能對外輸出動態(tài)的數(shù)據(jù)對象。但是,有點區(qū)別,是,reactive只支持輸入一個對象作為參數(shù),ref則還可以支持簡單的數(shù)據(jù)信息作為參數(shù)。待會有案例代碼展示。 下面看看代碼內(nèi)容。第一個

    2024年01月18日
    瀏覽(28)
  • Vue3前端開發(fā),watch偵聽器的深度監(jiān)聽和精確監(jiān)聽

    Vue3前端開發(fā),watch偵聽器的深度監(jiān)聽和精確監(jiān)聽

    Vue3前端開發(fā),watch偵聽器的深度監(jiān)聽和精確監(jiān)聽!今天和大家分享的內(nèi)容是,關于watch的深度偵聽和精確監(jiān)聽。 首先看一下,第一個案例,練習的是,深度監(jiān)聽的效果。默認是淺的偵聽,是不會觸發(fā)回調(diào)函數(shù)的。 如圖,當我們點擊按鈕,修改num值的時候,觸發(fā)了回調(diào)函數(shù),在

    2024年01月23日
    瀏覽(20)
  • 從壹開始前后端開發(fā)【.Net6+Vue3】(二)前端創(chuàng)建

    工作后,學習的腳步一直停停走走,希望可以以此項目為基礎,可以不斷的迫使自己不斷的學習以及成長 將以Girvs框架為基礎,從壹開始二次開發(fā)一個前后端管理框架 在這過程中一步步去學習使用到的技術(shù)點,也同時會將在此過程中遇到的問題進行分享 項目地址 上文介紹到

    2024年02月10日
    瀏覽(22)
  • 【Spring源碼分析】從源碼角度去熟悉依賴注入(二)

    【Spring源碼分析】從源碼角度去熟悉依賴注入(二)

    閱讀此需閱讀下面這些博客先 【Spring源碼分析】Bean的元數(shù)據(jù)和一些Spring的工具 【Spring源碼分析】BeanFactory系列接口解讀 【Spring源碼分析】執(zhí)行流程之非懶加載單例Bean的實例化邏輯 【Spring源碼分析】從源碼角度去熟悉依賴注入(一) 上篇這里簡單提一下哈,怕有些沒看的,

    2024年01月25日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包