本文講解 8 道高頻出現的 Vue 面試題及答案。javascript
複習前端面試的知識,是爲了鞏固前端的基礎知識,最重要的仍是平時的積累!
注意
:文章的題與題之間用下劃線分隔開,答案僅供參考。html
前端硬核面試專題的完整版在此:前端硬核面試專題,包含:HTML + CSS + JS + ES6 + Webpack + Vue + React + Node + HTTPS + 數據結構與算法 + Git 。前端
對 MVC、MVP 、MVVM 的理解vue
MVC 模式的意思是,軟件能夠分紅三個部分。java
各部分之間的通訊方式以下。git
MVP 模式將 Controller 更名爲 Presenter,同時改變了通訊方向。github
MVVM 模式將 Presenter 更名爲 ViewModel,基本上與 MVP 模式徹底一致。面試
惟一的區別是,它採用雙向綁定(data-binding):View 的變更,自動反映在 ViewModel,反之亦然。Angular 和 Ember 都採用這種模式。算法
如何理解 Vue 是異步執行 DOM 更新的 ?segmentfault
tick
中,Vue 刷新隊列並執行實際 (已去重的) 工做。Vue 在內部嘗試對異步隊列使用原生的 Promise.then 和 MessageChannel,若是執行環境不支持,會採用 setTimeout(fn, 0) 代替。例如,當你設置 vm.someData = 'new value' ,該組件不會當即從新渲染。
tick
更新。深刻響應式原理
如何追蹤變化
說下對 Virtual DOM 算法的理解 ?
包括幾個步驟:
Virtual DOM 本質上就是在 JS 和 DOM 之間作了一個緩存。能夠類比 CPU 和硬盤,既然硬盤這麼慢,咱們就在它們之間加個緩存:既然 DOM 這麼慢,咱們就在它們 JS 和 DOM 之間加個緩存。CPU(JS)只操做內存(Virtual DOM),最後的時候再把變動寫入硬盤(DOM)。
比較兩棵虛擬 DOM 樹的差別
比較兩棵 DOM 樹的差別是 Virtual DOM 算法最核心的部分,這也是所謂的 Virtual DOM 的 diff
算法。
兩個樹的徹底的 diff 算法是一個時間複雜度爲 O(n^3) 的問題。可是在前端當中,你不多會跨越層級地移動 DOM 元素。
因此 Virtual DOM 只會對同一個層級的元素進行對比:
上面的 div 只會和同一層級的 div 對比,第二層級的只會跟第二層級對比。這樣算法複雜度就能夠達到 O(n)。
深度優先遍歷,記錄差別
在實際的代碼中,會對新舊兩棵樹進行一個深度優先的遍歷,這樣每一個節點都會有一個惟一的標記:
在深度優先遍歷的時候,每遍歷到一個節點就把該節點和新的的樹進行對比。若是有差別的話就記錄到一個對象裏面。
Virtual DOM 算法主要是實現上面步驟的三個函數:element,diff,patch。而後就能夠實際的進行使用:
// 1. 構建虛擬 DOM var tree = el('div', {'id': 'container'}, [ el('h1', {style: 'color: blue'}, ['simple virtal dom']), el('p', ['Hello, virtual-dom']), el('ul', [el('li')]) ]) // 2. 經過虛擬 DOM 構建真正的 DOM var root = tree.render() document.body.appendChild(root) // 3. 生成新的虛擬 DOM var newTree = el('div', {'id': 'container'}, [ el('h1', {style: 'color: red'}, ['simple virtal dom']), el('p', ['Hello, virtual-dom']), el('ul', [el('li'), el('li')]) ]) // 4. 比較兩棵虛擬 DOM 樹的不一樣 var patches = diff(tree, newTree) // 5. 在真正的 DOM 元素上應用變動 patch(root, patches)
固然這是很是粗糙的實踐,實際中還須要處理事件監聽等;生成虛擬 DOM 的時候也能夠加入 JSX 語法。這些事情都作了的話,就能夠構造一個簡單的 ReactJS 了。
非父子組件如何通訊 ?
Vue 官網介紹了非父子組件通訊方法:
在 bus.js 裏面 寫入下面信息
import Vue from 'vue' export default new Vue();
在須要通訊的組件都引入 Bus.js
<template> <div id="emit"> <button @click="bus">按鈕</button> </div> </template > import Bus from './bus.js' export default { data() { return { message: '' } }, methods: { bus() { Bus.$emit('msg', '我要傳給兄弟組件們,你收到沒有') } } }
在鉤子函數中監聽 msg 事件:
<template> <div id="on"> <p>{{message}}</p> </div> </template> import Bus from './bus.js' export default { data() { return { message: '' } }, mounted() { let self = this Bus.$on('msg', (e) => { self.message = e console.log(`傳來的數據是:${e}`) }) } }
最後 p 會顯示來自 $emit 傳來的信息。
什麼狀況下我應該使用 Vuex ?
Vue 過程圖解
Vue 生命週期過程圖解
Vue 響應式原理
Vue 過程圖解
Vuex
前端硬核面試專題的完整版在此:前端硬核面試專題,包含:HTML + CSS + JS + ES6 + Webpack + Vue + React + Node + HTTPS + 數據結構與算法 + Git 。
若是以爲本文還不錯,記得給個 star , 你的 star 是我持續更新的動力!。