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

【源碼系列#01】vue3響應(yīng)式原理(Proxy)

這篇具有很好參考價值的文章主要介紹了【源碼系列#01】vue3響應(yīng)式原理(Proxy)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項目專欄,硬核??推薦??
歡迎各位ITer關(guān)注點(diǎn)贊收藏??????

在學(xué)習(xí) Vue3 是如何進(jìn)行對象的響應(yīng)式代理之前,我想我們應(yīng)該先去了解下 ES6 新增的API ProxyReflect,可參考【Vue3響應(yīng)式入門#02】Proxy and Reflect 。之后我們再手寫下 reactive 和 effect 的源碼

Reactive

定義: 接收一個普通對象然后返回該普通對象的響應(yīng)式代理。等同于 2.x 的 Vue.observable()

const obj = reactive({ count: 0 })

響應(yīng)式轉(zhuǎn)換是“深層的”:會影響對象內(nèi)部所有嵌套的屬性。基于 ES6 的 Proxy 實(shí)現(xiàn),返回的代理對象不等于原始對象。建議僅使用代理對象而避免依賴原始對象。

reactive.ts

Vue3中響應(yīng)數(shù)據(jù)核心是 reactive , reactive 中的實(shí)現(xiàn)是由 proxy 加 effect 組合,先來看一下 reactive 方法的定義

import { isObject } from '@vue/shared'
import { mutableHandlers, ReactiveFlags } from './baseHandler'

// key只能是對象;弱引用,更有效的垃圾回收、釋放內(nèi)存 - https://www.zhangxinxu.com/wordpress/2021/08/js-weakmap-es6/
const reactiveMap = new WeakMap()

/**
 * @desc 將數(shù)據(jù)轉(zhuǎn)化成響應(yīng)式的數(shù)據(jù)
 */
export function reactive(target) {
  // issue1
  if (!isObject(target)) {
    return
  }

  // issue2
  if (target[ReactiveFlags.IS_REACTIVE]) {
    return target
  }

  // issue3
  let existingProxy = reactiveMap.get(target)
  if (existingProxy) {
    return existingProxy
  }

  const proxy = new Proxy(target, mutableHandlers)
  reactiveMap.set(target, proxy)
  return proxy
}
  • @issue1 只能做對象的代理,不是對象,return

  • @issue2 代理對象被再次代理 可以直接返回代理對象

    我們可以利用 Proxy 的 get方法,來判斷他有沒有代理過

    如果訪問這個對象的 __v_isReactive 屬性,有值就說明代理過了,當(dāng)然,我們可以約定 __v_isReactive為任何字段

  • @issue3 同一個對象代理多次,返回同一個代理

    用 WeakMap去緩存對象和代理對象的映射關(guān)系

    代理完成時,將此對象和代理對象添加到 WeakMap緩存中;在代理之前,去 WeakMap中讀取此對象是否有代理對象的映射,若存在,則返回緩存中的代理對象

WeakMap:key只能是對象;弱引用,更有效的垃圾回收、釋放內(nèi)存,詳情請參考JS WeakMap應(yīng)該什么時候使用 ? 張鑫旭-鑫空間-鑫生活

baseHandler.ts

mutableHandlers 是 Proxy 的第二個參數(shù) handler對象提取封裝而來

  • track () 依賴收集
  • trigger () 觸發(fā)依賴

這兩個函數(shù)為 effect 里的方法,effect 為 reactive 的核心,后面我們會詳細(xì)介紹。先來看一下mutableHandlers 對象的定義

import { track, trigger } from './effect'

export const enum ReactiveFlags {
  IS_REACTIVE = '__v_isReactive',
}

export const mutableHandlers = {
  // 這里可以監(jiān)控到用戶取值了
  get(target, key, receiver) {
    if (key === ReactiveFlags.IS_REACTIVE) {
      return true
    }

    track(target, 'get', key)
    let res = Reflect.get(target, key, receiver)

    // @issue1 
    // 深度代理實(shí)現(xiàn), 性能好 取值就可以進(jìn)行代理
    if (isObject(res)) {
      return reactive(res)
    }
    return res
  },
  
  // 這里可以監(jiān)控到用戶設(shè)置值了
  set(target, key, value, receiver) {
    let oldValue = target[key] // 緩存老值
    let result = Reflect.set(target, key, value, receiver)
    
    if (oldValue !== value) {
      // 值變化了,觸發(fā)依賴
      trigger(target, 'set', key)
    }
    return result
  },
}

  • @issue1 嵌套對象深度代理。只有在取值時,才會進(jìn)行深度代理,性能好

    舉個例子,看如下代碼。當(dāng)我們對嵌套對象 product.rate 進(jìn)行取值時,就會觸發(fā) get劫持,然后深度代理嵌套對象 product.rate

const product = reactive({
  price: 5,
  quantity: 2,
  rate: {
    value: 0.9
  }
})

shared.ts

共享模塊

// 判斷是否是JS對象
export const isObject = function(value){
  return typeof value === 'object' && value !== null
}

參考資料

JS WeakMap應(yīng)該什么時候使用 ? 張鑫旭-鑫空間-鑫生活文章來源地址http://www.zghlxwxcb.cn/news/detail-746532.html

到了這里,關(guān)于【源碼系列#01】vue3響應(yīng)式原理(Proxy)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Vue3響應(yīng)式原理#02】Proxy and Reflect

    【Vue3響應(yīng)式原理#02】Proxy and Reflect

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點(diǎn)贊收藏?????? 以下是柏成根據(jù)Vue3官方課程整理的響應(yīng)式書面文檔 - 第二節(jié),課程鏈接在此:Proxy and Reflect - Vue 3 Reactivity | Vue Mastery 本篇文章將解決 上一篇文章 結(jié)

    2024年02月05日
    瀏覽(63)
  • 【Vue3響應(yīng)式原理#01】Reactivity

    【Vue3響應(yīng)式原理#01】Reactivity

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點(diǎn)贊收藏?????? 以下是柏成根據(jù)Vue3官方課程整理的響應(yīng)式書面文檔 - 第一節(jié),課程鏈接在此:Vue 3 Reactivity - Vue 3 Reactivity | Vue Mastery,本文檔可作為課程的輔助材料,

    2024年02月08日
    瀏覽(17)
  • 【手撕源碼】vue3響應(yīng)式原理解析(文末抽獎)

    【手撕源碼】vue3響應(yīng)式原理解析(文末抽獎)

    ?? 個人主頁: 不叫貓先生 ???♂? 作者簡介:2022年度博客之星前端領(lǐng)域TOP 2,前端領(lǐng)域優(yōu)質(zhì)作者、阿里云專家博主,專注于前端各領(lǐng)域技術(shù),共同學(xué)習(xí)共同進(jìn)步,一起加油呀! ??優(yōu)質(zhì)專欄:vue3從入門到精通、TypeScript從入門到實(shí)踐 ?? 資料領(lǐng)?。呵岸诉M(jìn)階資料以及文中源

    2024年02月03日
    瀏覽(21)
  • 【源碼系列#03】Vue3計算屬性原理(Computed)

    【源碼系列#03】Vue3計算屬性原理(Computed)

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點(diǎn)贊收藏?????? 傳入一個 getter 函數(shù),返回一個默認(rèn)不可手動修改的 ref 對象 或者傳入一個擁有 get 和 set 函數(shù)的對象,創(chuàng)建一個可手動修改的計算狀態(tài) @issue1 compute

    2024年02月05日
    瀏覽(51)
  • 【源碼系列#04】Vue3偵聽器原理(Watch)

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點(diǎn)贊收藏?????? 偵聽一個或多個響應(yīng)式數(shù)據(jù)源,并在數(shù)據(jù)源變化時調(diào)用所給的回調(diào)函數(shù) 第一個參數(shù)可以是不同形式的“數(shù)據(jù)源”:它可以是一個 ref (包括計算屬性

    2024年02月04日
    瀏覽(94)
  • 【Vue3響應(yīng)式入門#01】Reactivity

    【Vue3響應(yīng)式入門#01】Reactivity

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點(diǎn)贊收藏?????? 以下是柏成根據(jù)Vue3官方課程整理的響應(yīng)式書面文檔 - 第一節(jié),課程鏈接在此:Vue 3 Reactivity - Vue 3 Reactivity | Vue Mastery,本文檔可作為課程的輔助材料,

    2024年02月08日
    瀏覽(57)
  • 前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應(yīng)式原理。

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

    Vue的響應(yīng)式到底要干什么? 無非就是要知道當(dāng)你 讀取 對象的時候,要知道它讀了。要做一些別的事情 無非就是要知道當(dāng)你 修改 對象的時候,要知道它改了。要做一些別的事情 所以要想一個辦法, 把讀取和修改的動作變成一個函數(shù) ,讀取和修改的時候分別調(diào)用對應(yīng)的函數(shù)

    2024年04月17日
    瀏覽(35)
  • vue3響應(yīng)式原理

    vue3響應(yīng)式原理

    Vue 3 中的響應(yīng)式原理是通過使用 ES6 的 Proxy 對象來實(shí)現(xiàn)的。在 Vue 3 中,每個組件都有一個響應(yīng)式代理對象,當(dāng)組件中的數(shù)據(jù)發(fā)生變化時,代理對象會立即響應(yīng)并更新視圖。 具體來說,當(dāng)一個組件被創(chuàng)建時,Vue 會為組件的 data 對象創(chuàng)建一個響應(yīng)式代理對象。這個代理對象可以

    2024年02月15日
    瀏覽(37)
  • Vue3響應(yīng)式原理 私

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

    響應(yīng)式的本質(zhì):當(dāng)數(shù)據(jù)變化后會自動執(zhí)行某個函數(shù)映射到組件,自動觸發(fā)組件的重新渲染。 響應(yīng)式的實(shí)現(xiàn)方式就是劫持?jǐn)?shù)據(jù),Vue3的reactive就是通過Proxy劫持?jǐn)?shù)據(jù),由于劫持的是整個對象,所以可以檢測到任何對象的修改,彌補(bǔ)了2.0的不足。 名詞解釋: **副作用函數(shù):**函數(shù)的

    2024年02月10日
    瀏覽(21)
  • Vue3 數(shù)據(jù)響應(yīng)式原理

    核心: 通過Proxy(代理): 攔截對data任意屬性的任意(13種)操作, 包括屬性值的讀寫, 屬性的添加, 屬性的刪除等… 通過 Reflect(反射): 動態(tài)對被代理對象的相應(yīng)屬性進(jìn)行特定的操作 Vue3的響應(yīng)式比Vue2好在哪里? 效率更高了,Vue2中假設(shè)監(jiān)聽某個對象,該對象中有一萬個屬性,他要循

    2024年02月11日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包