由於object.defineproperty 無法監聽陣列的變化。
所以,在 vue2.x 版本中,作者用了一種 hack 的方式,即:重寫了陣列原型的方法。
雖然重寫,但基本和原來的方法一樣,只是多了通知檢視更新(因為改變了陣列)
陣列裡如果也有 object 型別,那麼繼續深度遍歷
【注】vue3.0 採用 proxy 監聽
如果不採用非同步更新,每次更新資料都會對當前元件進行重新渲染。為了效能考慮,vue 會在本輪資料更新後,再去非同步更新檢視。
當某個資料改變時,會通知 與該資料繫結的所有 watcher,會依次呼叫 watcher 的 update(),並不會立即執行,會先存放進乙個佇列中(該佇列中相同的 watcher 會被過濾),最後非同步更新
詳細舉例:
dep是在 資料劫持時,新建的例項。(即每個資料都會建立)
watcher是與html 文件中的資料有關,因為發布訂閱者模式本身就是為了讓 nodetype==3,即被 mustache 語法包裹起來的資料能都被更新到。所以,watcher 會在遍歷html 文件時新建。
nexttick(cb),該方法主要使用了 巨集任務和微任務,定義了乙個非同步方法,多次呼叫 nexttick 會將方法存入佇列中,通過這個非同步方法清空當前佇列。
會先將 cb儲存在陣列中
然後呼叫 timerfunc(),該方法會根據瀏覽器相容問題讓陣列中的 cb 採用 4 種方式去** cb
computed 和 methods 的區別:
computed 是具備快取的,只有當繫結的屬性發生變化時,才變化
methods 沒有快取,所以同樣呼叫 3 次,computed 有快取只會呼叫 1 次,而 methods 會呼叫 3 次
watch 和 computed 原理都是 watcher,只是 computed 具備快取
【computed 原理】:
computed 在 new watcher()時候,會有乙個lazy 的屬性,他是作為乙個標識屬性,表示這是乙個計算屬性,真正發生變化的是 dirty 屬性。
lazy 的標識,就是讓計算屬性在原始碼中是非非同步更新的。
在計算屬性裡用了 某個 data 裡的資料,會呼叫 該資料所對應的 get() 方法,該方法又會將 watcher 放入 dep 陣列中,當 該資料被修改時,呼叫 update,然後修改 dirty 為 true,表示被資料修改過,如果資料被修改,那麼計算屬性的下一次呼叫 就會發生改變。
watch 缺省會先執行。
4 個前後生命週期,總計 8 個生命週期函式,下面是比較用到的頁面中使用了$on,那需要在元件銷毀前用$off 解綁
清除自定義的定時器
解除事件繫結 scroll mousemove 等
Vue原理筆記3
vue 的事件繫結分為 原生事件繫結 元件事件繫結 原生 dom 事件的繫結,採用 addeventlistener 實現 元件繫結事件採用的是 on 方法 可以看成是 v bind value 加上 v on input 事件 的語法糖 xss 攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙...
Vue學習筆記(1)安裝vue
npm安裝vue 命令列輸入 node v 檢視node版本 驗證是否安裝成功 映象 可選 cnpm registry 安裝過 映象後就可以在命令列輸入cnpm代替npmle 安裝cli腳手架構建工具 命令列輸入 cnpm npm install g vue cli 安裝 初始化乙個專案 vue i...
vue學習筆記(1)
1 vue讀音,同view.2 vue是什麼?乙個mvvm框架 庫 特點 比較容易上手 小巧 mvvm,可以模擬mvc,mvp,mv mvx 3 官網 4 vue和angular區別?vue 簡單 易學 指令以 v 開頭,如 v 一片html 配合上json,再new出來vue例項 個人維護專案 適...