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

Vue2和Vue3響應(yīng)式原理實(shí)現(xiàn)的核心

這篇具有很好參考價(jià)值的文章主要介紹了Vue2和Vue3響應(yīng)式原理實(shí)現(xiàn)的核心。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Vue簡(jiǎn)介

Vue.js 是一個(gè)開源的漸進(jìn)式 JavaScript 前端框架,主要用于構(gòu)建用戶界面和單頁應(yīng)用程序(SPA)。Vue.js 可以輕松地與其他庫或現(xiàn)有項(xiàng)目集成使用,并被認(rèn)為是開發(fā)響應(yīng)式數(shù)據(jù)驅(qū)動(dòng)的現(xiàn)代 Web 應(yīng)用的一種有效方式。

Vue.js 的核心特點(diǎn):

  1. 響應(yīng)式數(shù)據(jù)綁定:Vue.js 可以通過對(duì)數(shù)據(jù)進(jìn)行雙向綁定來響應(yīng)用戶輸入和頁面變化。
  2. 組件化:Vue.js 使得開發(fā)者可以將單個(gè)組件變成一個(gè)獨(dú)立的模塊,組件性能優(yōu)良且可以重復(fù)利用。
  3. 基于模板的語法:Vue.js 提供了一套模板語法,使得開發(fā)者可以簡(jiǎn)單地編寫 HTML 模板,并將其與 Vue.js 組件綁定。

Vue2的響應(yīng)式原理

Vue2 的響應(yīng)式原理建立在 ES5 的 Object.defineProperty() 上,該方法可以定義對(duì)象的屬性,并對(duì)其進(jìn)行劫持,當(dāng)屬性值發(fā)生變化時(shí),Vue 可以檢測(cè)到該變化并重新渲染相應(yīng)的頁面內(nèi)容。

具體實(shí)現(xiàn)原理如下:

  1. 在 Vue 的初始化階段,Vue 會(huì)對(duì)傳入的 data 對(duì)象進(jìn)行遞歸劫持,將 data 對(duì)象的所有屬性都轉(zhuǎn)換成 getter/setter 形式。
  2. 當(dāng)頁面中使用數(shù)據(jù)時(shí),Vue 會(huì)通過訪問屬性的方式觸發(fā) getter 函數(shù),從而將當(dāng)前的 Watcher (觀察者)對(duì)象加入到當(dāng)前屬性的依賴中。
  3. 當(dāng)數(shù)據(jù)發(fā)生變化時(shí),Vue 會(huì)通過監(jiān)聽器檢測(cè)到變化,并觸發(fā)對(duì)應(yīng)屬性的 setter 函數(shù),從而通知該屬性下所有的依賴 Watcher 更新;
  4. Watcher 對(duì)象被通知后,會(huì)向?qū)?yīng)的組件發(fā)送消息通知需要重新渲染視圖,從而實(shí)現(xiàn)整個(gè)頁面的更新。

需要注意,Vue2 只能監(jiān)聽對(duì)象屬性的變化,并不能監(jiān)聽到添加/刪除對(duì)象屬性、數(shù)組方法的變化,因此我們可以使用 Vue.set() 或者 Vue.delete() 方法來更新對(duì)象屬性,但是只能使用原生 JavaScript 數(shù)組的 push()pop() 、splice() 、 shift() 、 unshift() 方法等來操作數(shù)組。

Vue2數(shù)據(jù)劫持的示例代碼如下:

const data = { msg: 'Hello Vue' }

Object.defineProperty(data, 'msg', {
  get() {
    console.log('get');
    return val;
  },
  set(newValue) {
    console.log('set', newValue);
    val = newValue;
  }
})

Object.defineProperty()詳解

Object.defineProperty() 是在 ES5 中新增的一個(gè)方法,用于為對(duì)象定義新的屬性或修改對(duì)象的屬性,其語法如下:

Object.defineProperty(obj, prop, descriptor)

其中的參數(shù)含義:

  • obj:要定義屬性的對(duì)象。
  • prop:要定義或修改的屬性的名稱。
  • descriptor:需要定義或修改的屬性描述符對(duì)象。

屬性描述符對(duì)象中包含以下可選屬性:

  • value:屬性的值,默認(rèn)為 undefined。
  • writable:如果為 true,則該屬性的值可以被賦值運(yùn)算符改變,默認(rèn)為 false。
  • enumerable:如果為 true,則該屬性可以在枚舉對(duì)象屬性時(shí)被枚舉,默認(rèn)為 false。
  • configurable:如果為 true,則可以使用 Object.defineProperty() 方法修改該屬性的描述符,默認(rèn)為 false。
  • get:屬性讀取方法。
  • set:屬性賦值方法。

Object.defineProperty()的缺點(diǎn)

  • 無法監(jiān)聽數(shù)組的變化
    Vue2 把會(huì)修改原來數(shù)組的方法定義為變異方法。
    變異方法例如 push、pop、shift、unshift、splice、sort、reverse等,是無法觸發(fā) set 的。
    非變異方法,例如 filter,concat,slice 等,它們都不會(huì)修改原始數(shù)組,而會(huì)返回一個(gè)新的數(shù)組。
    Vue2 的做法是把這些變異方法重寫來實(shí)現(xiàn)監(jiān)聽數(shù)組變化。
  • 必須遍歷對(duì)象的每個(gè)屬性
    使用 Object.defineProperty 多數(shù)情況下要配合 Object.keys 和遍歷,于是就多了一層嵌套。
    并且由于遍歷的原因,假如對(duì)象上的某個(gè)屬性并不需要“劫持”,但此時(shí)依然會(huì)對(duì)其添加“劫持”。
  • 必須深層遍歷嵌套的對(duì)象
    當(dāng)一個(gè)對(duì)象為深層嵌套的時(shí)候,必須進(jìn)行逐層遍歷,直到把每個(gè)對(duì)象的每個(gè)屬性都調(diào)用 Object.defineProperty() 為止。

Vue3的響應(yīng)式原理

Vue3 的響應(yīng)式原理主要使用了 ES6 的 Proxy 代替了 Vue2 中的 Object.defineProperty(),從而實(shí)現(xiàn)了更加高效和強(qiáng)大的數(shù)據(jù)劫持和響應(yīng)式。

Proxy 對(duì)象可以通過對(duì)訪問和修改數(shù)據(jù)的攔截來實(shí)現(xiàn)數(shù)據(jù)劫持。而 Reflect 對(duì)象則提供了更加靈活和易用的數(shù)據(jù)操作方法,比如可以使用 Reflect.has() 來檢查對(duì)象是否有某個(gè)屬性,使用 Reflect.defineProperty() 來代替 Object.defineProperty()。

具體實(shí)現(xiàn)原理如下:

  1. 在 Vue3 的初始化階段,Vue3 會(huì)對(duì)傳入的 data 對(duì)象通過使用 Proxy 對(duì)象進(jìn)行代理,即使用 new Proxy(target, handler),其中 target 是被代理的對(duì)象,handler 是一個(gè)對(duì)象,用來定義代理 target 中的操作。

  2. 當(dāng)頁面中使用數(shù)據(jù)時(shí),Vue3 會(huì)觸發(fā) get 操作,代理對(duì)象 handler.get() 會(huì)被調(diào)用,進(jìn)而讓 handler 捕獲該操作,并將當(dāng)前的 Watcher (觀察者)對(duì)象加入到當(dāng)前屬性的依賴中。

  3. 當(dāng)數(shù)據(jù)發(fā)生變化時(shí),Vue3 會(huì)通過監(jiān)聽器檢測(cè)到變化,并觸發(fā)對(duì)應(yīng)數(shù)據(jù)的 set 操作,代理對(duì)象 handler.set() 會(huì)被調(diào)用,從而通知該屬性下所有依賴的 ‘Watcher’ 對(duì)象更新;

  4. Watcher 對(duì)象被通知后,會(huì)向?qū)?yīng)的組件發(fā)送消息通知需要重新渲染視圖,從而實(shí)現(xiàn)整個(gè)頁面的更新。

Vue3 中使用 Proxy 對(duì)象實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式的代碼如下:

const data = { msg: 'Hello Vue' }

const reactiveData = new Proxy(data, {
  get(target, key) {
    console.log('get');
    return target[key];
  },
  set(target, key, value) {
    console.log('set');
    target[key] = value;
    return true;
  }
})

上述代碼中,data 對(duì)象通過 Proxy 對(duì)象 reactiveData 進(jìn)行代理,當(dāng)訪問 reactiveData 對(duì)象的屬性時(shí),Proxy 對(duì)象內(nèi)部的 get() 函數(shù)被調(diào)用;當(dāng)設(shè)置屬性時(shí),Proxy 對(duì)象內(nèi)部的 set() 函數(shù)被調(diào)用。在 get() 和 set() 函數(shù)中,可以對(duì)屬性的讀取和賦值進(jìn)行攔截,從而實(shí)現(xiàn)數(shù)據(jù)的響應(yīng)式。

Proxy詳解

Proxy 是在 ES6 中新增的一個(gè)對(duì)象,用于代理另一個(gè)對(duì)象并攔截該對(duì)象的讀取、賦值、屬性定義等一系列操作,其語法如下:

new Proxy(target, handler)

Proxy中的參數(shù):

  • target:被代理的目標(biāo)對(duì)象。
  • handler:一個(gè)對(duì)象,其屬性是鉤子函數(shù)(trap),用于攔截代理對(duì)象的操作。

handler 包含以下可選鉤子函數(shù)(trap):文章來源地址http://www.zghlxwxcb.cn/news/detail-476963.html

  • get(target, prop):用于攔截對(duì)象的讀取操作。
  • set(target, prop, value):用于攔截對(duì)象的賦值操作。
  • has(target, prop):用于攔截 in 操作。
  • deleteProperty(target, prop):用于攔截 delete 操作。
  • apply(target, thisArg, args):用于攔截函數(shù)調(diào)用。
  • construct(target, args):用于攔截 new 操作。

Proxy的優(yōu)點(diǎn)

  • Proxy可以直接監(jiān)聽對(duì)象而非屬性;
  • Proxy可以直接監(jiān)聽數(shù)組的變化;
  • Proxy返回的是一個(gè)新對(duì)象,我們可以只操作新的對(duì)象達(dá)到目的,而Object.defineProperty只能遍歷對(duì)象屬性直接修改;

到了這里,關(guān)于Vue2和Vue3響應(yīng)式原理實(shí)現(xiàn)的核心的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Vue2向Vue3過度核心技術(shù)路由

    Vue2向Vue3過度核心技術(shù)路由

    1.思考 單頁面應(yīng)用程序,之所以開發(fā)效率高,性能好,用戶體驗(yàn)好 最大的原因就是: 頁面按需更新 比如當(dāng)點(diǎn)擊【發(fā)現(xiàn)音樂】和【關(guān)注】時(shí), 只是更新下面部分內(nèi)容 ,對(duì)于頭部是不更新的 要按需更新,首先就需要明確: 訪問路徑 和 組件 的對(duì)應(yīng)關(guān)系! 訪問路徑 和 組件的對(duì)

    2024年02月11日
    瀏覽(26)
  • Vue2向Vue3過度核心技術(shù)插槽

    Vue2向Vue3過度核心技術(shù)插槽

    1.作用 讓組件內(nèi)部的一些 結(jié)構(gòu) 支持 自定義 2.需求 將需要多次顯示的對(duì)話框,封裝成一個(gè)組件 3.問題 組件的內(nèi)容部分, 不希望寫死 ,希望能使用的時(shí)候 自定義 。怎么辦 4.插槽的基本語法 組件內(nèi)需要定制的結(jié)構(gòu)部分,改用****占位 使用組件時(shí), ****標(biāo)簽內(nèi)部, 傳入結(jié)構(gòu)替換slo

    2024年02月11日
    瀏覽(20)
  • Vue2.0 的響應(yīng)式原理 私

    Vue2.0 的響應(yīng)式原理 私

    使用的Object.defineProperty()重新定義對(duì)象,給data的每個(gè)屬性都添加了getter和setter方法。這時(shí)候會(huì)為對(duì)象的每個(gè)屬性創(chuàng)建一個(gè)Dep實(shí)例? (依賴)。Dep實(shí)例可以訂閱和通知相關(guān)的Watcher實(shí)例。,? 這一步叫? 數(shù)據(jù)劫持? 或者 依賴收集 在數(shù)據(jù)發(fā)生更新后調(diào)用 set 時(shí)會(huì)通知發(fā)布者 notify

    2024年02月11日
    瀏覽(19)
  • vue2響應(yīng)式原理----發(fā)布訂閱模式

    vue2響應(yīng)式原理----發(fā)布訂閱模式

    很多人感覺vue2的響應(yīng)式其實(shí)用到了觀察者+發(fā)布訂閱。我們先來看一下簡(jiǎn)單的發(fā)布訂閱的代碼: 從上面中發(fā)現(xiàn)一個(gè)重要的點(diǎn),發(fā)布者和訂閱者是根據(jù)key值來區(qū)分的,然后通過消息中心來中轉(zhuǎn)的,他們家是是實(shí)現(xiàn)不知道對(duì)方是誰。 而觀察者模式中觀察者是一開始就知道自己觀察

    2024年04月14日
    瀏覽(17)
  • 從Vue2到Vue3【零】——Vue3簡(jiǎn)介及創(chuàng)建

    從Vue2到Vue3【零】——Vue3簡(jiǎn)介及創(chuàng)建

    內(nèi)容 鏈接 從Vue2到Vue3【零】 Vue3簡(jiǎn)介 從Vue2到Vue3【一】 Composition API(第一章) 從Vue2到Vue3【二】 Composition API(第二章) 從Vue2到Vue3【三】 Composition API(第三章) 從Vue2到Vue3【四】 Composition API(第四章) Vue.js作為一種流行的JavaScript框架已經(jīng)被廣泛應(yīng)用于前端開發(fā)中。隨著

    2024年02月16日
    瀏覽(50)
  • Vue2向Vue3過度Vuex核心概念mutations

    Vue2向Vue3過度Vuex核心概念mutations

    1.定義mutations 2.格式說明 mutations是一個(gè)對(duì)象,對(duì)象中存放修改state的方法 3.組件中提交 mutations 4.練習(xí) 1.在mutations中定義個(gè)點(diǎn)擊按鈕進(jìn)行 +5 的方法 2.在mutations中定義個(gè)點(diǎn)擊按鈕進(jìn)行 改變title 的方法 3.在組件中調(diào)用mutations修改state中的值 5.總結(jié) 通過mutations修改state的步驟 1.定義

    2024年02月11日
    瀏覽(49)
  • 202 vue2的響應(yīng)式原理 通俗易懂!

    Object.defineProperty + 依賴追蹤 。 在Vue實(shí)例化過程中,會(huì) 遞歸 地將 每個(gè)數(shù)據(jù)對(duì)象 的 屬性 轉(zhuǎn)換為 getter/setter ,并維護(hù)一個(gè) 依賴收集器(Dep) 。 每個(gè)屬性 都有一個(gè)關(guān)聯(lián)的 watcher ,當(dāng) 數(shù)據(jù)發(fā)生 變化時(shí) , watcher 會(huì) 被通知 并 更新視圖 。 Vue 2.x 實(shí)現(xiàn)響應(yīng)式數(shù)據(jù): vue實(shí)例化 時(shí),會(huì)

    2024年02月06日
    瀏覽(30)
  • Vue | (一)Vue核心(上) | 尚硅谷Vue2.0+Vue3.0全套教程

    Vue | (一)Vue核心(上) | 尚硅谷Vue2.0+Vue3.0全套教程

    學(xué)習(xí)鏈接:尚硅谷Vue2.0+Vue3.0全套教程丨vuejs從入門到精通,本文對(duì)應(yīng)p1-p25,博客參考尚硅谷公開筆記,補(bǔ)充記錄實(shí)操。 英文官網(wǎng) 中文官網(wǎng) 關(guān)于官網(wǎng)(與視頻p3已略有出入):文檔指南,API查字典,互動(dòng)指南,示例… Vue開發(fā)者工具安裝 vscode插件安裝,提效 想讓Vue工作,就必

    2024年02月20日
    瀏覽(46)
  • Vue | (一)Vue核心(下) | 尚硅谷Vue2.0+Vue3.0全套教程

    Vue | (一)Vue核心(下) | 尚硅谷Vue2.0+Vue3.0全套教程

    學(xué)習(xí)鏈接:尚硅谷Vue2.0+Vue3.0全套教程丨vuejs從入門到精通,本文對(duì)應(yīng)p26-p52,博客參考尚硅谷公開筆記,補(bǔ)充記錄實(shí)操。 在應(yīng)用界面中, 某個(gè)(些)元素的樣式是變化的。 class/style 綁定就是專門用來實(shí)現(xiàn)動(dòng)態(tài)樣式效果的技術(shù)。 class樣式 寫法: class=\\\"xxx\\\" ,xxx可以是字符串、對(duì)象、數(shù)

    2024年02月19日
    瀏覽(28)
  • Vue2向Vue3過度核心技術(shù)工程化開發(fā)和腳手架

    Vue2向Vue3過度核心技術(shù)工程化開發(fā)和腳手架

    1.1 開發(fā)Vue的兩種方式 核心包傳統(tǒng)開發(fā)模式:基于html / css / js 文件,直接引入核心包,開發(fā) Vue。 工程化開發(fā)模式:基于構(gòu)建工具(例如:webpack)的環(huán)境中開發(fā)Vue。 工程化開發(fā)模式優(yōu)點(diǎn): 提高編碼效率,比如使用JS新語法、Less/Sass、Typescript等通過webpack都可以編譯成瀏覽器識(shí)

    2024年02月11日
    瀏覽(66)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包