vue原理相關總結

雨花石發表於2022-02-11

一、vue2.0的雙向繫結是怎麼實現的

1、view和model相互實時更新原理:Object.defineProperty資料劫持+釋出者-訂閱者(依賴收集)模式
2、observer,compile,watcher
(1)observe是一個資料監聽器,核心方法是Object.defineProperty
(2)watcher是一個訂閱者,將Observer發來的update訊息處理,執行更新
(3)compile是一個指令解析器,對需要監聽的節點和屬性進行掃描和解析。
3、此模式的優點:不需要顯式呼叫,可以直接通知變化,更新檢視;劫持了屬性setter,不需要額外的diff操作
4、Object.defineProperty缺點
(1)不能監聽陣列
(2)不能監聽整個物件,只能監聽屬性
(3)不能監聽屬性的增刪,只能監聽變化
5、3.0版本使用Proxy
(1)可以監聽陣列
(2)可直接監聽整個物件,不用層層遞迴屬性
(3)get和set時候直接有引數,不需要單獨儲存變數
(4)new Proxy()會返回一個新物件,不會汙染源物件。
6、參考文件:https://blog.nowcoder.net/n/8517450fe4fd4220b4078f9c61e42ec1#:~:text=Vue%20%E6%95%B0%E6%8D%AE%E5%8F%8C%E5%90%91%E7%BB%91%E5%AE%9A,%E6%89%A7%E8%A1%8C%E5%AF%B9%E5%BA%94%E7%9A%84%E6%9B%B4%E6%96%B0%E5%87%BD%E6%95%B0%E3%80%82

二、資料不更新的問題

1、更新的原理:在資料讀取時收集依賴,在賦值時通知依賴更新。
2、object有defineProperty方法,通過getter,setter只監聽了屬性的讀取和賦值,但是新增屬性和刪除屬性沒有檢測,所以專門提供了$set和$delete來實現

3、array,沒有defineProperty方法,沒有setter,通過get和新建陣列方法攔截器修改原生方法push,pop,shift,unshift,splice,sort,reserve來實現監聽,而通過修改陣列下標運算元組的不會被檢測,所以專門提供了$set和$delete來實現

4、$set(target, key, value)和$delete(target, propertyName/index)方法原理
(1)判斷target是否是undefined,null,或者原始型別,或者vue例項,或者vue例項的跟資料物件
(2)target為陣列,則還是通過呼叫splice操作索引更新資料
(3)target為物件,且為響應式,則呼叫defineReactive運算元據
(4)更新完資料後通知依賴更新

三、computed和watch和methods

1、computed
(1)設計初衷:為了使模板中的邏輯運算更簡單
(2)適用於資料被重複使用或者計算複雜費時的場景; 依賴其他資料的場景
(3)讀取快取,依賴不變,則不需重新計算。(根據dirty標誌判斷)
2、watch是對資料的監聽回撥
3、computed和watch的區別
相同點:都會觀察頁面的資料變化
不同點:(1)computed是讀取快取,watch每次都要重新執行;
(2)watch更適合資料變化時的非同步操作和開銷較大的操作。
4、computed和methods的區別
computed依賴快取,可以定義getter和setter,但是methods不行

四、vue-router的模式區別

1、abstract:非瀏覽器環境下使用
2、hash:
(1)預設。監聽hashchange實現。
(2)有點,相容性好,ie8支援
(3)缺點:看起來奇怪
3、history:
(1)h5新增的。允許開發者直接修改前端路由而不重新觸發請求頁面
(2)實現原理:監聽popstate事件。能監聽到使用者點選瀏覽器的前進後退事件或者手動呼叫go,back,forward事件;不能監聽到pushState和replaceState事件。
(3)為了避免瀏覽器重新整理出現的404頁面,需要在服務端配置相容。
(4)如果瀏覽器不支援,會降級到hash模式
* 通過vue.use外掛機制和vue.mixin將store在beforeCreate和destroyed生命週期進行混入。

五、vuex解決了什麼問題

1、vuex解決了vue專案中的資料狀態管理問題
2、是元件通訊的一種方式。
3、原理:建立了單一的狀態樹,包含state,mutation,action,getter,module。
4、view(dispatch)action(commit)mutation(mutate)state(render)view
5、通過vue的data和computed,讓state變成響應式,
6、通過vue.use外掛機制和vue.mixin將store在beforeCreate生命週期進行混入。

六、nextTick是怎麼是實現的

1、作用:將回撥延遲到下次DOM更新迴圈之後執行
2、原因:VUE在更新DOM時是非同步的,vue檢測到資料變化後,不會立即更新DOM,而是會開啟一個事件佇列,並緩衝同一時間迴圈中的所有資料變更,在下一次tick中,執行更新DOM。
3、js的執行機制:js是單執行緒的,基於事件迴圈,有巨集任務和微任務。
4、內部原理:
    (1)能力檢測:Promise.then(微), MutationObserve(微),setImmediate(微),setTimeout(巨集)
    (2)將回撥函式推入回撥佇列,鎖上易步鎖,執行回撥。

七、keep-alive內建元件和LRU演算法(佇列)

1、自身不會渲染成DOM,沒有常規的<template>標籤,是個函式元件,被他包裹的元件,切換時會被快取在記憶體中,而不是銷燬。
    (1)可以有條件的快取:include(匹配到的快取),exclude(匹配到的不快取),max(最多可以快取多少元件例項)
2、原理:內部維護了this.cache(快取的元件物件)和this.keys(this.cache中的key),運用LRU策略。
    (1)命中了快取的元件要調整元件key的順序。
    (2)快取的元件數量如果超過this.max時,要刪除第一個快取元件。
    (3)LRU(Least recently used,最近最少使用):根據資料的歷史訪問記錄來進行淘汰資料。“如果資料最近被訪問過,那麼將來被訪問的機率也更高。”
3、生命週期鉤子:activated和deactivated,被keep-alive包括的元件啟用和停用時呼叫。先停用元件的deactivated,再啟用元件的activated

相關文章