1. 程式人生 > 實用技巧 >面試準備(6)vue專題

面試準備(6)vue專題

響應式資料的原理

核心點Object.defineProperty

vue在data中初始化資料時,會給data中的屬性使用Object.defineProperty重新定義屬性。

當頁面取到對應屬性時,會進行依賴收集,如果屬性發生變化則會通知想關依賴進行操作。

vue如何檢測陣列變化?

1.使用函式劫持的方式,重寫了陣列的方法。

2.Vue將data中的陣列,進行了原型鏈重寫,指向了自己定義的陣列原型方法,這樣當呼叫陣列api時,

可以通知依賴更新。如果陣列中包含引用型別,會對陣列中的引用型別再次進行監控。

3.vue之所以無法監聽陣列的變化,原因就是受js的限制,但是vue也有解決辦法,可以通過vue.set()去解決,使其做響應式變化。

為什麼vue採用非同步渲染

因為vue是元件級更新,若是不採用非同步更新,每次更新資料都會對當前元件進行重新渲染,

所以為了效能考慮,vue會在本輪資料更新後,再去非同步更新檢視。

nextTick的實現原理是什麼?

在下次DOM更新迴圈結束之後執行的延遲迴調。

作用:
nextTick用於下次Dom更新迴圈結束之後執行延遲迴調,在修改資料之後使用nextTick用於下次Dom更新迴圈結束之後執行延遲迴調,

在修改資料之後使用nextTick,則可以在回撥中獲取更新後的DOM。

應用場景:

需要在檢視更新之後,基於新的檢視進行操作。

實現原理:

nextTick方法主要是使用了巨集任務和微任務,定義了一個非同步方法,多次呼叫nextTick會將方法存入佇列中,通過這個非同步方法清空佇列。

在vue中有nextTick這個API,官方解釋,它可以在DOM更新完畢之後執行一個回撥。

一般使用:

this.$nextTick(() => {

    ...

})

vue中computed的特點

預設computed也是一個watcher 是具備快取的,只有當依賴的屬性發生變化才會更新檢視。

生命週期

生命週期什麼時候呼叫

beforeCreate:在例項初始化之後,資料觀測之前被呼叫。

create:例項已經建立完成之後呼叫,已完成資料觀測,屬性和方法的運算,這裡沒有$el。

beforeMount:再掛載之前被呼叫,相關的render函式首次被呼叫。//template

mounted:el被新建立的vm.$el替換,並掛載到例項上去,呼叫該鉤子。

beforeUpdata:資料更新時呼叫,發生在虛擬DOM重新渲染之前。

updata:由於資料更改導致的虛擬DOM重新渲染,在這之後會呼叫該鉤子。

beforeDestroy:例項銷燬之前呼叫,在這一步,例項仍然完全可用。

destroyed:vue例項銷燬後呼叫。呼叫後,vue例項的所有東西都會解除繫結,

           所有的事件監聽器都會被移除,所有的子例項也會被銷燬。

生命週期內部可以做什麼事情:

create:例項已經建立你完成,可以進行一些資料資源的請求。

mounted:例項已經掛載完成,可以進行一些DOM的操作。

beforeUpdata:可以在這個鉤子內進一步的更改狀態,這不必會觸發附加的重渲染過程。

update:可以執行依賴DOM的操作,大多數情況下應該避免在此期間更改狀態,以為這可能導致更新無限迴圈。

     該鉤子在伺服器渲染期間不被呼叫。

destroyed:可以執行一些優化操作,清空計時器,解除繫結事件。

vue中的diff演算法

1.先同級比較,再比較子節點。

2.先判斷一方有兒子一方沒兒子的情況。

3.比較都有兒子的情況。

4.遞迴比較子節點。