成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

朋友問我 vue 響應式怎么實現,我說 Proxy,他沉默了……

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

Hello,大家好,我是 Sunday。

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

1.Reactive 的實現原理

Reactive 是基于 Proxy 進行實現的,這個概念很多同學都是知道的。我們可以通過 vue 的源碼來看下這個實現:

圖片圖片

代碼比較復雜,大家可以只看我紅框中的內容。

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

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

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

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

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

2.Proxy 的問題

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

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

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

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

  p.name = '李四'  // 打印:觸發了 set
  p.child.name = '小李四' // 打印:觸發了 get。注意:并沒有觸發 child 的 set

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

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

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

但是,在 Vue 中 多層的 Reactive 對象卻可以實現響應性,那么這是如何做到的呢? 具體的方式就是 Reactive的懶響應性

3.Reactive的懶響應性

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

圖片圖片

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

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

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

圖片圖片

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

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

責任編輯:武曉燕 來源: 程序員Sunday
相關推薦

2021-04-06 06:23:18

MVCC并發事務

2020-06-09 11:35:30

Vue 3響應式前端

2022-06-26 00:00:02

Vue3響應式系統

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 開發編程語言

2022-09-02 10:34:23

數據Vue

2019-07-09 09:19:51

分布式事務App

2019-07-01 13:34:22

vue系統數據

2021-01-22 11:47:27

Vue.js響應式代碼

2020-02-11 13:22:20

this函數JavaScript

2023-01-19 00:13:28

代碼技術計劃

2020-07-31 08:06:39

MySQL遞歸查詢

2021-08-11 14:33:38

注解springAutowired

2024-07-26 10:47:10

2021-12-02 05:50:35

Vue3 插件Vue應用

2020-12-14 10:25:08

DNS通信IP

2021-11-05 11:10:13

MyBatisSQL查詢

2021-05-19 14:25:19

前端開發技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线观看日韩 | 麻豆changesxxx国产 | 综合国产在线 | 久综合 | 中文日韩字幕 | 日韩精品一区二区三区中文字幕 | 久久久久久黄 | 国产成人精品a视频 | 热99| 亚洲91视频 | 亚洲欧美激情精品一区二区 | 亚洲日韩中文字幕一区 | 国产欧美二区 | 精品久久久久久亚洲综合网站 | 蜜桃传媒av| 国产欧美视频一区二区三区 | 日韩成人在线视频 | 97精品国产97久久久久久免费 | 第一区在线观看免费国语入口 | 成人在线中文字幕 | 亚洲国产成人精品久久 | 国产aaaaav久久久一区二区 | 欧美一级黄视频 | 香蕉婷婷 | 久久久久91 | 欧美精品网 | 久久国产成人精品国产成人亚洲 | 九九热在线视频观看这里只有精品 | 欧美亚洲国语精品一区二区 | 日韩在线不卡 | 成人国产精品久久 | 国产精品久久欧美久久一区 | 女女百合av大片一区二区三区九县 | 日韩精品一区二区三区高清免费 | 日韩成人精品一区二区三区 | 欧日韩在线| 日本天天操 | 亚洲国产精品久久久久 | 91精品国产91久久久久久三级 | 色就干| 一区二区三区高清 |