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

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

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

專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項(xiàng)目專欄,硬核??推薦??

歡迎各位ITer關(guān)注點(diǎn)贊收藏??????

背景

以下是柏成根據(jù)Vue3官方課程整理的響應(yīng)式書面文檔 - 第一節(jié),課程鏈接在此:Vue 3 Reactivity - Vue 3 Reactivity | Vue Mastery,本文檔可作為課程的輔助材料,配合食用,快樂雙倍!

我們先來看一下這個簡單的Vue應(yīng)用程序,Ok!如果我們加載了這個組件,然后我們的價格price發(fā)生了改變,Vue是如何知道更新模版內(nèi)容的呢?接下來,我們將會用 Vue3 建造響應(yīng)式的方法,從頭開始制造一個響應(yīng)式引擎,讓我們一步一步的來解決這個問題!

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

dep

How can we save the total calculation, so we can run it agine when price or quantity updates ?

如何存儲 total 的計(jì)算方式,當(dāng) price 或 quantities 更新時,total 再計(jì)算一次?

我們想將下面這段代碼存儲在某種儲藏室中,然后我們需要運(yùn)行它,之后我們還想再次運(yùn)行這個被存儲的代碼【被存儲可能有多種功能代碼】

let total = price * quantity

讓我們來實(shí)現(xiàn)一下,下面所列舉的effect() 、 track()trigger()你都可以在 Vue3 響應(yīng)性源碼中看到同名的函數(shù)。

  • dep:一個 Set 對象,存儲我們的effects,或者說是一個effect集(Set)。我們在這里使用 Set 的原因是 Set 不允許出現(xiàn)重復(fù)值,當(dāng)我們嘗試添加同樣的effect時,它不會變成 Set 集合的兩個子成員
  • effect():一個方法,包含了我們想要存儲的代碼
  • track():一個方法,使用dep變量去保存effect
  • trigger():一個方法,遍歷dep去運(yùn)行我們存儲的所有代碼

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

depsMap

Often our objects will have multiple properties and each property will need their own dep. How can we store these ?

通常,我們的對象會有多個屬性,每個屬性都需要自己的 Dep(依賴關(guān)系),或者說 effect 的 Set 集合,那么,我們?nèi)绾未鎯Γ蛘哒f怎樣才能讓每個屬性都擁有自己的依賴呢?

我們現(xiàn)在擁有一個product對象,其每一個屬性都需要有自己的dep。【dep其實(shí)就是一個effect集(Set),這個 effect集應(yīng)該在值發(fā)生改變時重新運(yùn)行?!?/p>

正如我們看到的,dep的類型是 Set,Set 中的每個值都只是一個我們需要執(zhí)行的effect,就像我們這個計(jì)算total的匿名函數(shù)。要把這些dep存儲起來,且方便我們以后在找到他們,我們要創(chuàng)建一個depsMap

  • depsMap: 一個 Map 對象,存儲了每個屬性到其自己依賴dep對象的映射;每一個屬性都擁有它們自己的,可以重新運(yùn)行effectdep;我們使用對象屬性名作為鍵,比如pricequantity,值是一個depeffect集】

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

讓我們來實(shí)現(xiàn)一下,代碼如下:

<html>
  <head></head>
  <body>
    <div id="app">
      <div>depsMap</div>
    </div>
  </body>
  <script>
    const depsMap = new Map()

    // Save this code
    function track(key) {
      let dep = depsMap.get(key) // Get the dep for this property
      if (!dep) {
        depsMap.set(key, (dep = new Set())) // No dep yet, so let's create one 
      }
      dep.add(effect) // Add this effect Since it's a set, it won't add the effect again if it already exists
    }

    // Run all the code I've saved 
    function trigger(key) {
      let dep = depsMap.get(key) // Get the dep for the key
      if (dep) {
        dep.forEach(effect => {
          effect() // If it exists, run each effect
        })
      }
    }

    let product = {
      price: 5,
      quantity: 2,
    }
    let total = 0

    let effect = () => {
      total = product.price * product.quantity
    }

    track('quantity')
    effect()
  </script>
</html>

當(dāng)我們觸發(fā)函數(shù)trigger('quantity') , effect就運(yùn)行了;控制臺輸出結(jié)果如下:

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

現(xiàn)在我們就對 對象中的不同屬性 有了一種跟蹤依賴關(guān)系的方法

targetMap

What if we have multiple reactive objects that each need to track effects ?

如果我們有多個響應(yīng)式對象,每個響應(yīng)式對象屬性都需要存儲 effect 呢?例如?

let product = { price: 5, quantity: 2 } 
let user = { name: "burc", age: 18 }

到目前為止,我們有一張 depsMap,它存儲了每個屬性自己的依賴對象(屬性到自己依賴對象的映射)。然后每個屬性都擁有它們自己的并可以重新運(yùn)行effectdep。

我們這里需要一個其他對象,即 targetMap 。它的鍵以某種方式引用了我們的響應(yīng)性對象,例如productuser

  • targetMap: 一個 WeakMap 對象,它儲存了與每個 響應(yīng)性對象屬性 關(guān)聯(lián)的依賴,在 Vue3 中,它被稱為目標(biāo)圖
  • WeakMap: 與 Map 結(jié)構(gòu)類似,但只接受對象作為鍵名(null除外),不接受其他類型的值作為鍵名

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

用一個簡單的例子告訴我們 WeakMap 是如何工作的,如想了解詳細(xì)API請移步 阮一峰ES6文檔-WeakMap

let product = { price: 5, quantity: 2 }

const targetMap = new WeakMap()
targetMap.set(product, "example code to test")

console.log(targetMap.get(product))
//"example code to test"

讓我們來實(shí)現(xiàn)一下,代碼如下:

<html>
  <head></head>
  <body>
    <div id="app">
      <div>targetMap</div>
    </div>
  </body>
  <script>
    const targetMap = new WeakMap() // For storing the dependencies for each reactive object

    // Save this code
    function track(target, key) {
      let depsMap = targetMap.get(target) // Get the current depsMap for this target(reactive object - product)
      if (!depsMap) {
        targetMap.set(target, (depsMap = new Map())) // If it doesn't exist, create it
      }
      let dep = depsMap.get(key) // Get the dependency object for this peoperty - quantity
      if (!dep) {
        depsMap.set(key, (dep = new Set())) // If it doesn't exist, create it
      }
      dep.add(effect) // Add the effect to the dependency
    }

    // Run all the code I've saved
    function trigger(target, key) {
      const depsMap = targetMap.get(target) // Does this object have any properties that have dependencies?
      if (!depsMap) {
        return // If no, return from the function immediately
      }
      let dep = depsMap.get(key) // Otherwise, check if this property has a dependency
      if (dep) {
        dep.forEach(effect => {
          effect()
        }) // Run those
      }
    }

    let product = { price: 5, quantity: 2 }
    let total = 0

    let effect = () => {
      total = product.price * product.quantity
    }

    track(product, 'quantity')
    effect()
  </script>
</html>

當(dāng)我們觸發(fā)函數(shù) trigger(product, 'quantity'),effect就運(yùn)行了;控制臺輸出結(jié)果如下:

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

diagram

讓我們再分析概括一下圖表

  • targetMap:存儲了每個 響應(yīng)性對象屬性 關(guān)聯(lián)的依賴;類型是 WeakMap
  • depsMap:存儲了每個屬性的依賴;類型是 Map
  • dep:存儲了我們的effects,一個effects集,這些effect在值發(fā)生變化時重新運(yùn)行;類型是 Set

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

Now!我們就實(shí)現(xiàn)了一種儲存不同effect的方法,但是我們還沒有辦法讓我們的effect自動重新運(yùn)行。這是第二個重要的部分,將在下一篇文章講解!文章來源地址http://www.zghlxwxcb.cn/news/detail-710861.html

到了這里,關(guān)于【Vue3響應(yīng)式入門#01】Reactivity的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(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)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

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

相關(guān)文章

  • 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中setup語法糖解決響應(yīng)式的方案,所有的只要被ref或者reactive包裹的變量,都會轉(zhuǎn)變成響應(yīng)式。而在VUE2中,要想做成響應(yīng)式,必須將變量定義在data函數(shù)中。 以下代碼定義了三個User對象,并且都是使用ref做成了響應(yīng)式,當(dāng)點(diǎn)擊按鈕改變User對象的值的時候,頁面上的值也會被

    2024年02月08日
    瀏覽(20)
  • Vue3實(shí)現(xiàn)響應(yīng)式編程

    Vue 3的響應(yīng)式編程實(shí)現(xiàn)主要是基于Proxy和Object.defineProperty。以下是對Vue 3的響應(yīng)式編程實(shí)現(xiàn)的簡單說明和代碼示例。 在Vue 3中,響應(yīng)式數(shù)據(jù)是通過使用JavaScript的Proxy對象實(shí)現(xiàn)的。Proxy對象可以用來定義基本操作的自定義行為(如屬性查找,賦值,枚舉,函數(shù)調(diào)用等)。 Vue 3使用

    2024年01月22日
    瀏覽(25)
  • 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響應(yīng)式系統(tǒng)(二)

    Vue3響應(yīng)式系統(tǒng)(二)

    Vue3響應(yīng)式系統(tǒng)(一) https://blog.csdn.net/qq_55806761/article/details/135587077 ? ? ? ? 什么場景會用到effect嵌套呢?聽我娓娓道來。 ? ? ? ? 就用Vue.js來說吧,Vue.js的渲染函數(shù)就是在effect中執(zhí)行的: ? ? ? ? 當(dāng)組件發(fā)生嵌套的時候,渲染的時候effect函數(shù)中就會發(fā)生effect嵌套。 ? ? ? ?

    2024年01月20日
    瀏覽(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)
  • Vue3響應(yīng)式源碼實(shí)現(xiàn)

    Vue3響應(yīng)式源碼實(shí)現(xiàn)

    初始化項(xiàng)目結(jié)構(gòu) reactive.ts effect.ts 測試 執(zhí)行 tsc 轉(zhuǎn)成 js 代碼,沒有 tsc 的全局安裝 typescript 新建 index.js ,分別引入 effect.js 和 reactive.js 新建 index.html 然后再根目錄執(zhí)行 安裝依賴 然后新建 webpack.config.js 執(zhí)行命令啟動項(xiàng)目

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

    手寫Vue3響應(yīng)式數(shù)據(jù)原理

    我們想要對一個對象數(shù)據(jù)進(jìn)行處理,從而實(shí)現(xiàn)更改dom。但如何更改對一個對象數(shù)據(jù)進(jìn)行更改呢? vue2 的雙向數(shù)據(jù)綁定是利?ES5 的?個 API ,Object.defineProperty()對數(shù)據(jù)進(jìn)?劫持 結(jié)合 發(fā)布訂閱模式的?式來實(shí)現(xiàn)的。 vue3 中使?了 ES6 的 ProxyAPI 對數(shù)據(jù)代理,通過 reactive() 函數(shù)給每?

    2024年02月11日
    瀏覽(19)
  • Vue3-01-Vue3 新特性及環(huán)境搭建

    Vue3-01-Vue3 新特性及環(huán)境搭建

    Vue.js是一種被廣泛使用的JavaScript框架,用于構(gòu)建用戶界面和單頁面應(yīng)用。Vue3是其最新的主要版本,引入了許多新特性并做了一些改進(jìn)。 Vue2 和 Vue3 在數(shù)據(jù)響應(yīng)性系統(tǒng)的實(shí)現(xiàn)上采用了不同的方式:Vue2 使用 Object.defineProperty,而 Vue3 則選擇了 Proxy。 (1)?Vue2:Object.defineProperty 在

    2024年02月07日
    瀏覽(23)
  • vue3-響應(yīng)式基礎(chǔ)之ref

    ref() 在組合式 API 中,推薦使用 ref() 函數(shù)來聲明響應(yīng)式狀態(tài): ref() 接收參數(shù),并將其包裹在一個帶有 .value 屬性的 ref 對象中返回: 形式1 setup() 函數(shù) 要在組件模板中訪問 ref,請從組件的 setup() 函數(shù)中聲明并返回它們: 注意,在模板中使用 ref 時,我們不需要附加 .value。為了

    2024年01月18日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包