偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

朋友問我 vue 響應(yīng)式怎么實(shí)現(xiàn),我說 Proxy,他沉默了……

開發(fā) 前端
所謂的 Reactive的懶響應(yīng)性 指的就是:Reactive 最初只會為復(fù)雜數(shù)據(jù)類型執(zhí)行第一層的響應(yīng)性。如果存在多層的復(fù)雜數(shù)據(jù)類型嵌套時,則會在使用到(getter 行為)該子集時,才會再次為該子集包裝 proxy(執(zhí)行 reactive 方法)

Hello,大家好,我是 Sunday。

Reactive 的懶響應(yīng)性 可能很多同學(xué)之前沒有聽說過這個概念。最近一個同學(xué)在面試中就被問到了這個問題。所以說,咱們今天就借助這篇文章來看下:在vue3中,什么是 Reactive 的懶響應(yīng)性?

1.Reactive 的實(shí)現(xiàn)原理

Reactive 是基于 Proxy 進(jìn)行實(shí)現(xiàn)的,這個概念很多同學(xué)都是知道的。我們可以通過 vue 的源碼來看下這個實(shí)現(xiàn):

圖片圖片

代碼比較復(fù)雜,大家可以只看我紅框中的內(nèi)容。

通過上圖紅框中的代碼,我們可以很清晰的看到在 Reactive 里面,Vue 最終通過 new Proxy 的方式生成了一個 Proxy 的實(shí)例對象。 這個 Proxy 的實(shí)例就是 reactive() 方法調(diào)用時的返回值。

我們可以通過如下偽代碼表示:

function reactive (target) {
  return new Proxy(target, {....})
}

const test = reactive({name: '張三'})

在這種情況下,{name: '張三'} 就會被包裝成一個 響應(yīng)式對象,proxy 通過監(jiān)聽它的 getter、setter 行為來觸發(fā)響應(yīng)性。

2.Proxy 的問題

Proxy 可以代理對象,這個是沒有問題的。但是:Proxy 只能代理一層對象,而不能代理多層

什么意思呢?假如當(dāng) 代理對象 具備層級嵌套的時候,proxy 是不可以代理子層級的。我們可以通過以下代碼來進(jìn)行測試:

const target = {
    name: '張三',
    child: {
      name: '小張三'
    }
  }

  const p = new Proxy(target, {
    set(target, property, value, receiver) {
      console.log('觸發(fā)了 set');
      target[property] = value
      return true
    },
    get(target, property, receiver) {
      console.log('觸發(fā)了 get');
      return target[property]
    }
  })

  p.name = '李四'  // 打?。河|發(fā)了 set
  p.child.name = '小李四' // 打印:觸發(fā)了 get。注意:并沒有觸發(fā) child 的 set

在上述代碼中,我們利用 proxy 代理了 target 對象。注意:此時的 target 是存在嵌套的復(fù)雜數(shù)據(jù)類型 child

當(dāng)我們執(zhí)行 p.name = '李四' 時,觸發(fā) set 行為,這是一個很正常的邏輯。但是,當(dāng)我們執(zhí)行 p.child.name = '小李四' 時,我們會發(fā)現(xiàn) 僅觸發(fā)了一個 get(p.child),而沒有觸發(fā) set 行為。

這就證明:對于 Proxy 而言, 它只能代理 一層 的復(fù)雜數(shù)據(jù)類型,而不可以代理多層。

但是,在 Vue 中 多層的 Reactive 對象卻可以實(shí)現(xiàn)響應(yīng)性,那么這是如何做到的呢? 具體的方式就是 Reactive的懶響應(yīng)性。

3.Reactive的懶響應(yīng)性

我們觀察 Vue 的源碼,在源碼監(jiān)聽 proxy getter 行為的地方,存在這樣一段代碼(我把代碼稍微做了一些調(diào)整,讓大家看的可以更加清晰):

圖片圖片

核心的代碼就在紅框的位置,其中的 res 大家可以理解為 target[property] 。

而根據(jù) 01:Reactive 的實(shí)現(xiàn)原理 我們知道 reactive 方法本質(zhì)上就是生成了一個 Proxy 實(shí)例。所以說,這里的代碼核心其實(shí)就是 一旦獲取到的屬性是對象,則會為該對象再次執(zhí)行 reactive 方法。

如果用偽代碼表示,就是下面這樣:

圖片圖片

即:再次通過 Proxy 完成代理,并返回

所以說,所謂的 Reactive的懶響應(yīng)性 指的就是:Reactive 最初只會為復(fù)雜數(shù)據(jù)類型執(zhí)行第一層的響應(yīng)性。如果存在多層的復(fù)雜數(shù)據(jù)類型嵌套時,則會在使用到(getter 行為)該子集時,才會再次為該子集包裝 proxy(執(zhí)行 reactive 方法)。

責(zé)任編輯:武曉燕 來源: 程序員Sunday
相關(guān)推薦

2021-04-06 06:23:18

MVCC并發(fā)事務(wù)

2020-06-09 11:35:30

Vue 3響應(yīng)式前端

2022-06-26 00:00:02

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

2020-04-10 08:03:04

分布式鎖Redlock算法流行算法

2024-07-01 00:00:02

2020-10-15 09:35:27

亂碼UTF-8GBK

2020-09-24 14:40:55

Python 開發(fā)編程語言

2022-09-02 10:34:23

數(shù)據(jù)Vue

2019-07-01 13:34:22

vue系統(tǒng)數(shù)據(jù)

2019-07-09 09:19:51

分布式事務(wù)App

2021-01-22 11:47:27

Vue.js響應(yīng)式代碼

2020-02-11 13:22:20

this函數(shù)JavaScript

2021-08-11 14:33:38

注解springAutowired

2020-07-31 08:06:39

MySQL遞歸查詢

2023-01-19 00:13:28

代碼技術(shù)計(jì)劃

2024-07-26 10:47:10

2021-12-02 05:50:35

Vue3 插件Vue應(yīng)用

2020-12-14 10:25:08

DNS通信IP

2021-11-05 11:10:13

MyBatisSQL查詢

2021-05-19 14:25:19

前端開發(fā)技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號