Vue性能「二十」-- vue常見面試題

vue常見面試題整理:

使用及原理篇:

組件間的通訊

組件生命週期

解釋MVVM

響應式原理

vue3.0 響應式原理

虛擬DOM

模板編譯

組件渲染過程

vue-router的路由模式

Vuex

computed和watch的區別及原理

Vue常見性能優化方式

其他:

雙向綁定原理:

vue.js 則是採用數據劫持結合發佈者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變動時發佈消息給訂閱者,觸發相應的監聽回調。

首先我們爲每個vue屬性用Object.defineProperty()實現數據劫持,

爲每個屬性分配一個訂閱者集合的管理數組dep;然後在編譯的時候在該屬性的數組dep中添加訂閱者(v-model會添加一個訂閱者,{{}}也會,v-bind也會,只要用到該屬性的指令理論上都會)

(接着爲input會添加監聽事件,修改值就會爲該屬性賦值,觸發該屬性的set方法,)
在set方法內通知訂閱者數組dep,訂閱者數組循環調用各訂閱者的update方法更新視圖。
參考地址

ajax應該放在哪個生命週期

mounted(渲染完成,dom加載完成)
JS是單項程的,ajax是異步加載,等dom加載完再去渲染數據
放在在mounted之前沒有用,只會讓邏輯更加混亂

如何將組件所有props傳遞給子組件?

<User v-bind="$props" />(細節知識點,優先級不高)

雙向數據綁定v-model 的實現原理 深入

input 元素的 value=this.name
綁定input 事件 this.name =$event.target.value
data 觸發 re-render

用vnode描述一個DOM結構

見前面實例

監聽data變化核心API是什麼,有何缺點

Object.defindePropery
深度監聽、監聽數組

爲什麼組件data必須是個函數?

.vue文件編譯完後是class,不同的地方使用組件時是對class的實例化;
執行data時,如果不是函數的話,每個實例的數據共享了;
如果data是函數,每個實例都會執行函數,data屬性都會在閉包中,就不會相互影響

多個組件相同邏輯,如何抽離?

mixin 見前面知識點
以及mixin的一些缺點

vue如何監聽數組變化

Object.defindePropery不能監聽數組變化
重新定義原型,重寫push pop等方法實現監聽
Proxy可以原生支持數組變化

diff算法的時間複雜度

O(n)
在 O(n^3)基礎上做了調整

描述diff算法的過程

patch(elem,vnode)和patch(vnode,newVnode)
patchVnode addVnodes removeVnodes
updateChildren (key的重要性)

如何配置 vue-router異步加載

當我們開發vue+webpack項目時,可能會發現打包出的項目js過大,嚴重影響了首屏頁面的訪問速度,這就需要利用vue路由的異步加載組
在頁面路由配置js文件中,避免在開頭直接引入相關組件,當配置特定路由對應組件時再使用import引入對應組件。
{
path: '/app',
component: () => import('../pages/application.vue')
}
**報錯unexpected
token的解決辦法:
**項目安裝babel-plugin-syntax-dynamic-import,(解析識別import()動態導入語法)
然後在.babelrc中配置“plugins”:[“syntax-dynamic-import”],
重啓服務即可

Vue 中 action和mutation有什麼區別?

action處理異步,mutation不可以
mutation做原子操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章