20+道必知必會的Vue面試題(附答案解析)
這篇文章整理了20 Vue面試題分享給大家,同時附上答案解析。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
【相關面試題推薦:vue面試題(2021)】
從鏡片的厚度和黃黑相見的格子襯衫我察覺到,面前坐著的這位面試官應該是來者不善。
我跟以往一樣,準備花3分鐘的時間進行自我介紹。在這段期間,為了避免尷尬,我盯著面試官的眉毛中間,不過面試官顯然對我的經歷不是很感興趣。他在1分半的時候打斷了我。
你覺得自己最擅長的技術堆疊是什麼?
Vue吧,我很喜歡尤大,最近剛發布了Vue的首部紀錄片,真的很好看。
0.那你能講一講MVVM嗎?
MVVM是Model-View-ViewModel
縮寫,也就是把MVC
中的Controller
演變成ViewModel
。 Model層代表資料模型,View代表UI元件,ViewModel是View和Model層的橋樑,資料會綁定到viewModel層並自動將資料渲染到頁面中,視圖變化的時候會通知viewModel層更新資料。 (學習影片分享:vue影片教學)
1.簡單說Vue2.x響應式資料原理
##Vue在初始化資料時,會使用
Object.defineProperty重新定義data中的所有屬性,當頁面使用對應屬性時,首先會進行依賴收集(收集目前元件的
watcher)如果屬性發生變更會通知相關依賴進行更新操作(
發布訂閱)。
2.那你知道Vue3.x響應式資料原理嗎?
(還好我有看,這個難不倒我)
Proxy取代Object.defineProperty 。因為Proxy可以直接監聽物件和陣列的變化,並且有多達13種攔截方法。並且作為新標準將受到瀏覽器廠商重點持續的效能最佳化。
reactive方法做代理,
這樣就實現了深度觀測。
3.再說一下vue2.x中如何監測數組變化
使用了函數劫持的方式,重寫了數組的方法,Vue將data中的數組進行了原型鏈重寫,指向了自己定義的數組原型方法。這樣當呼叫數組api時,可以通知依賴更新。如果數組中包含引用類型,則會對數組中的引用類型再次遞歸遍歷進行監控。這樣就實現了監測數組變化。
(原型鏈的細節可以參考我的另一篇專欄)
#4.nextTick知道嗎,實作原理是什麼?
在下次 DOM 更新迴圈結束之後執行延遲回呼。 nextTick主要使用了巨集任務和微任務。根據執行環境分別嘗試採用
- Promise
- MutationObserver
- setImmediate
- 如果以上都不行則採用setTimeout
(關於巨集任務和微任務以及事件循環可以參考我的另兩篇專欄)(看到這你就會發現,其實問框架最終還是考驗你的原生JavaScript功底)
5.說Vue的生命週期
#beforeCreate
是new Vue()之後觸發的第一個鉤子,在當前階段data、methods、computed以及watch上的資料和方法都不能被存取。
created
在實例創建完成後發生,當前階段已經完成了數據觀測,也就是可以使用數據,更改數據,在這裡更改數據不會觸發updated函數。可以做一些初始資料的獲取,在當前階段無法與Dom進行交互,如果非要想,可以透過vm.$nextTick來存取Dom。
beforeMount
發生在掛載之前,在這之前template模板已導入渲染函數編譯。而當前階段虛擬Dom已經創建完成,即將開始渲染。在此時也可以對資料進行更改,不會觸發updated。
mounted
在掛載完成後發生,在當前階段,真實的Dom掛載完畢,資料完成雙向綁定,可以存取到Dom節點,使用$refs屬性對Dom進行操作。
beforeUpdate
發生在更新之前,也就是響應式資料發生更新,虛擬dom重新渲染之前被觸發,你可以在當前階段進行更改數據,不會造成重渲染。
updated
發生在更新完成之後,目前階段元件Dom已完成更新。要注意的是避免在此期間更改數據,因為這可能會導致無限循環的更新。
beforeDestroy
發生在實例銷毀之前,在目前階段實例完全可以被使用,我們可以在這時進行善後收尾工作,例如清除計時器。
destroyed
發生在實例銷毀之後,這個時候只剩下了dom空殼。元件已被拆解,資料綁定被卸除,監聽被移出,子實例也統統被銷毀。
(關於Vue的生命週期詳解感興趣的也請移步我的另一篇專欄)
6.你的介面請求一般放在哪個生命週期?
介面要求一般放在mounted
中,但要注意的是服務端渲染時不支援mounted,需要放到created
中。
7.再說Computed和Watch
#Computed
本質上是具備快取的watcher,依賴的屬性發生變化就會更新視圖。
適用於計算比較消耗效能的計算場景。當表達式過於複雜時,在模板中放入過多邏輯會讓模板難以維護,可以將複雜的邏輯放入計算屬性中處理。
Watch
沒有快取性,更多的是觀察的作用,可以監聽某些資料執行回呼。當我們需要深度監聽物件中的屬性時,可以開啟deep:true
選項,這樣便會對物件中的每一項進行監聽。這樣會帶來效能問題,優化的話可以使用字串形式
監聽,如果沒有寫到元件中,不要忘記使用unWatch手動登出
哦。
8.說v-if和v-show的差別
#當條件不成立時,v-if
就不會渲染DOM元素,v-show
操作的是樣式(display),切換目前DOM的顯示與隱藏。
9.元件中的data為什麼是一個函數?
一個元件被重複使用多次的話,也會建立多個實例。本質上,這些實例用的都是同一個建構子
。如果data是物件的話,物件屬於參考類型,會影響到所有的實例。所以為了確保元件不同的實例之間data不會衝突,data必須是一個函數。
10.說v-model的原理
#v-model
本質就是一個語法糖,可以看成是value input
方法的語法糖。
可以透過model屬性的prop
和event
屬性來進行自訂。原生的v-model,會根據標籤的不同產生不同的事件和屬性。
11.Vue事件綁定原理說
#原生事件綁定是透過addEventListener
綁定給真實元素的,元件事件綁定是透過Vue自訂的$on
實現的。
面試官:(這小子基礎還可以,接下來我得上上難度了)
12.Vue模版編譯原理知道嗎,能簡單說一下嗎?
簡單地說,Vue的編譯過程就是將template
轉換成render
函數的過程。會經歷以下階段:
- 生成AST樹
- 優化
- #codegen
先解析模版,產生AST語法樹
(一種用JavaScript物件的形式來描述整個模板)。
使用大量的正規表示式對模板進行解析,遇到標籤、文字的時候都會執行對應的鉤子進行相關處理。
Vue的資料是響應式的,但其實範本中並不是所有的資料都是響應式的。有一些資料首次渲染後就不會再變化,對應的DOM也不會改變。那麼最佳化過程就是深度遍歷AST樹,依照相關條件標記樹節點。這些被標記的節點(靜態節點)我們就可以跳過對它們的比對
,對運行時的模板起到很大的優化作用。
編譯的最後一步是將最佳化後的AST樹轉換為可執行的程式碼
。
面試官:(精神小伙子啊,有點東西,難度提升,不信難不倒你)
13.Vue2.x和Vue3.x渲染器的diff演算法分別說一下
簡單來說,diff演算法有以下過程
- 同級比較,再比較子節點
- 先判斷一方有子節點一方沒有子節點的情況(如果新的children沒有子節點,將舊的子節點移除)
- 比較都有子節點的情況(核心diff)
- 遞迴比較子節點
正常Diff兩棵樹的時間複雜度是O(n^3)
,但實際情況下我們很少會進行跨層級的移動DOM
,所以Vue將Diff進行了最佳化,從O(n^3) -> O(n)
,只有當新舊children都為多個子節點時才需要用核心的Diff演算法進行同層級比較。
Vue2的核心Diff演算法採用了雙端比較
的演算法,同時從新舊children的兩端開始進行比較,借助key值找到可重複使用的節點,再進行相關操作。相較於React的Diff演算法,同樣情況下可以減少移動節點次數,減少不必要的效能損耗,更加的優雅。
在創建VNode時就確定其類型,以及在 mount/patch
的過程中採用位元運算
來判斷一個VNode的類型,在這個基礎之上再配合核心的Diff演算法,使得效能上較Vue2.x有了提升。 (實際的實作可以結合Vue3.x源碼看。)
該演算法中也運用了動態規劃
的思想求解最長遞歸子序列。
(看到這你還會發現,框架內無處不蘊藏著資料結構和演算法的魅力)
面試官:(可以可以,看來是個苗子,不過自我介紹屬實有些無聊,下一題)
(基操,勿6)
#14.再說一下虛擬Dom以及key屬性的作用
由於在瀏覽器中操作DOM是很昂貴的。頻繁的操作DOM,會產生一定的效能問題。這就是虛擬Dom的產生原因
。
Vue2的Virtual DOM借鑒了開源函式庫snabbdom
的實作。
Virtual DOM本質就是用一個原生的JS物件去描述一個DOM節點。是對真實DOM的一層抽象。
(也就是原始碼中的VNode類,它定義在src/core/vdom/vnode.js中。)
VirtualDOM映射到真實DOM要經歷VNode的create、diff、patch等階段。
key的作用是盡可能的複用 DOM 元素。
新舊 children 中的節點只有順序是不同的時候,最佳的操作應該是透過移動元素的位置來達到更新的目的。
需要在新舊 children 的節點中保存映射關係,以便能夠在舊 children 的節點中找到可重複使用的節點。 key也就是children中節點的唯一識別。
15.keep-alive了解嗎
#keep-alive
可以實作元件緩存,當元件切換時不會對目前組件進行卸載。
常用的兩個屬性include/exclude
,允許元件有條件的進行快取。
兩個生命週期activated/deactivated
,用來得知目前元件是否處於活躍狀態。
keep-alive的中也運用了LRU(Least Recently Used)
演算法。
(又是資料結構與演算法,原來演算法在前端也有這麼多的應用)
16.Vue中元件生命週期呼叫順序說一下
元件的呼叫順序都是先父後子
,渲染完成的順序是先子後父
。
元件的銷毀操作是先父後子
,銷毀完成的順序是先子後父
。
載入渲染過程
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount- >子mounted->父mounted
#子元件更新過程
父beforeUpdate->子beforeUpdate->子updated->父updated
父元件更新過程
##父beforeUpdate -> 父updated
銷毀過程
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
##17.Vue2.x組件通訊有哪些方式?
-
父子元件通訊
$on、$emit父->子
props
,子->父
$parent、$children取得父子元件實例
#Ref取得實例的方式呼叫元件的屬性或方法
Provide、inject 官方不建議使用,但是寫入元件庫時很常用 -
Vue.prototype.$bus = new Vue兄弟元件通訊
Event Bus
實作跨元件通訊
Vuex -
Vuex跨級元件通訊
$attrs、$listeners
#Provide、inject
#18 .SSR了解嗎?
SSR也就是服務端渲染,
也就是將Vue在客戶端把標籤渲染成HTML的工作放在服務端完成,然後再把html直接回傳給客戶端
SSR有著更好的SEO、且首屏載入速度更快等優點。不過它也有一些缺點,例如我們的開發條件會受到限制,伺服器端渲染只支援
beforeCreate
和
兩個鉤子,當我們需要一些外部擴充程式庫時需要特殊處理,服務端渲染應用程式也需要處於Node.js的運作環境。還有就是伺服器會有更大的負載需求。
19.你都做過哪些Vue的效能最佳化?編碼階段
- #盡量減少data中的數據,data中的資料都會增加getter和setter,會收集對應的watcher
- v-if和v-for不能連用
- 如果需要使用v-for給每項元素綁定事件時使用事件代理
- SPA 頁面採用keep-alive快取元件
- 在更多的情況下,使用v-if取代v-show
- key保證唯一
- 使用路由懶加載、非同步組件
- 防手震、節流
- 第三方模組按需導入
- 長列表捲動至視覺區域動態載入
SEO最佳化
- #預先渲染
打包優化
- 壓縮程式碼
- Tree Shaking/Scope Hoisting
- 使用cdn加載第三方模組
- 多執行緒打包happypack
- splitChunks抽離公共檔案
##使用者體驗
- 骨架螢幕
- PWA
20.hash路由和history路由實現原理說一下
location.hash
的值實際上是URL中
##後面的東西。
history實際上採用了HTML5中提供的API來實現,主要有
history.pushState()和
history.replaceState()
更多程式相關知識,請造訪:程式設計影片
! ! ###以上是20+道必知必會的Vue面試題(附答案解析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP與Vue:完美搭檔的前端開發利器在當今網路快速發展的時代,前端開發變得愈發重要。隨著使用者對網站和應用的體驗要求越來越高,前端開發人員需要使用更有效率和靈活的工具來創建響應式和互動式的介面。 PHP和Vue.js作為前端開發領域的兩個重要技術,搭配起來可以稱得上是完美的利器。本文將探討PHP和Vue的結合,以及詳細的程式碼範例,幫助讀者更好地理解和應用這兩

在前端開發面試中,常見問題涵蓋廣泛,包括HTML/CSS基礎、JavaScript基礎、框架和函式庫、專案經驗、演算法和資料結構、效能最佳化、跨域請求、前端工程化、設計模式以及新技術和趨勢。面試官的問題旨在評估候選人的技術技能、專案經驗以及對行業趨勢的理解。因此,應試者應充分準備這些方面,以展現自己的能力和專業知識。

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

Django是一個由Python編寫的web應用框架,它強調快速開發和乾淨方法。儘管Django是web框架,但要回答Django是前端還是後端這個問題,需要深入理解前後端的概念。前端是指使用者直接和互動的介面,後端是指伺服器端的程序,他們透過HTTP協定進行資料的互動。在前端和後端分離的情況下,前後端程式可以獨立開發,分別實現業務邏輯和互動效果,資料的交

什麼是JPA?它與JDBC有什麼不同? JPA(JavaPersistenceapi)是一個用於物件關係映射(ORM)的標準接口,它允許Java開發者使用熟悉的Java物件來操作資料庫,而無需編寫直接針對資料庫的sql查詢。而JDBC(JavaDatabaseConnectivity)是Java用來連接資料庫的標準API,它需要開發者使用SQL語句來操作資料庫。 JPA將JDBC封裝起來,為物件-關聯映射提供了更方便、更高層級的API,簡化了資料存取操作。在JPA中,什麼是實體(Entity)?實體

Go語言作為一種快速、高效的程式語言,在後端開發領域廣受歡迎。然而,很少有人將Go語言與前端開發聯繫起來。事實上,使用Go語言進行前端開發不僅可以提高效率,還能為開發者帶來全新的視野。本文將探討使用Go語言進行前端開發的可能性,並提供具體的程式碼範例,幫助讀者更了解這一領域。在傳統的前端開發中,通常會使用JavaScript、HTML和CSS來建立使用者介面

Go框架是一組擴充Go內建程式庫的元件,提供預製功能(例如網路開發和資料庫操作)。受歡迎的Go框架包括Gin(Web開發)、GORM(資料庫操作)和RESTful(API管理)。中間件是HTTP請求處理鏈中的攔截器模式,用於在不修改處理程序的情況下新增身份驗證或請求日誌記錄等功能。 Session管理透過儲存使用者資料來保持會話狀態,可以使用gorilla/sessions管理session。

Golang與前端技術結合:探討Golang如何在前端領域發揮作用,需要具體程式碼範例隨著互聯網和行動應用的快速發展,前端技術也愈發重要。而在這個領域中,Golang作為一門強大的後端程式語言,也可以發揮重要作用。本文將探討Golang如何與前端技術結合,以及透過具體的程式碼範例來展示其在前端領域的潛力。 Golang在前端領域的角色作為一門高效、簡潔且易於學習的
