回覆列表
  • 1 # botaoH

    Object.defineProperty中可以設定getter和setter,透過setter監聽資料改變。這也是為什麼vue無法監聽到陣列push,pop之類的改變。

  • 2 # 小金剛bees

    收集依賴的方式其實和普通object是一樣的,只是需要遍歷一下陣列。這個可以看Observer Class的constructor(core/observer/index). 如果是陣列則呼叫observeArray, 遍歷陣列,分別observe每一個元素。 最大的區別就是Array有一組方法定義在prototype上可以改變陣列,這個應該是你的問題。 這個問題其實很簡單,思想和defineReactive中的setter是一樣的,包裹prototype的方法就好了。這個可以看core/observer/array. 其中methodsToPatch就是定義了需要複寫的方法,下面重寫每個方法。重寫的步驟就是

    得到願prototype方法的值如果arguments是array的話,也需要變成observer (observeArray)最後notify依賴

    基本上就是這樣。如果已經在原始碼層面理解整個reacticity是如何工作的,對於array的處理就比較好理解。

    很多細節沒法展開,希望有幫助

  • 3 # ShuangLiu07

    Vue 1.x/2.x 主要靠Object.defineProperty的getter / setter,偵測資料是否改變,對於多層資料或Array,基本上就是靠遞迴迴圈去遍歷所有物件。這個方法效能不算高效,尤其對於多層物件或者Array來說不友好,並且某些資料修改方法無法監測到改變

    Vue3 優化了檢測方案,使用了es6原生的proxy Api(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy),可以檢測攔截一個物件的基本操作,因為瀏覽器原生層面的支援,比js單獨定義defineProperty高效很多,也更簡單,對array的各種監聽也更容易。當然對於大物件的深層檢測,遍歷迴圈還是少不了

  • 中秋節和大豐收的關聯?
  • 怎樣做好優質的三農自媒體?