搜尋
首頁web前端Vue.js20+道必知必會的Vue面試題(附答案解析)

20+道必知必會的Vue面試題(附答案解析)

Apr 06, 2021 am 09:41 AM
javascript前端vue.js面試

這篇文章整理了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響應式資料原理嗎?


(還好我有看,這個難不倒我)


#Vue3.x改用

Proxy取代Object.defineProperty 。因為Proxy可以直接監聽物件和陣列的變化,並且有多達13種攔截方法。並且作為新標準將受到瀏覽器廠商重點持續的效能最佳化。

Proxy只會代理物件的第一層,那麼Vue3又是怎麼處理這個問題的呢?
(很簡單啊)

判斷目前Reflect.get的回傳值是否為Object,如果是則再透過

reactive方法做代理,這樣就實現了深度觀測。

監控數組的時候可能觸發多次get/set,那麼如何防止觸發多次呢?
我們可以判斷key是否為目前被代理物件target自身屬性,也可以判斷舊值與新值是否相等,只有滿足以上兩個條件之一時,才有可能執行trigger。

面試官抬起頭了。心裡暗想

(這小子還行,比上兩個強,應該是多多少少看過Vue3的源碼了)

3.再說一下vue2.x中如何監測數組變化


使用了函數劫持的方式,重寫了數組的方法,Vue將data中的數組進行了原型鏈重寫,指向了自己定義的數組原型方法。這樣當呼叫數組api時,可以通知依賴更新。如果數組中包含引用類型,則會對數組中的引用類型再次遞歸遍歷進行監控。這樣就實現了監測數組變化。


(能問到這的面試官都比較注重深度,這些常規操作要記牢)

(原型鏈的細節可以參考我的另一篇專欄)

一文帶你徹底搞懂JavaScript原型鏈

#4.nextTick知道嗎,實作原理是什麼?


在下次 DOM 更新迴圈結束之後執行延遲回呼。 nextTick主要使用了巨集任務和微任務。根據執行環境分別嘗試採用


    Promise
  • MutationObserver
  • setImmediate
  • 如果以上都不行則採用setTimeout
定義了一個非同步方法,多次呼叫nextTick會將方法存入佇列中,透過這個非同步方法清空目前佇列。

(關於巨集任務和微任務以及事件循環可以參考我的另兩篇專欄)

(看到這你就會發現,其實問框架最終還是考驗你的原生JavaScript功底)

  • 瀏覽器中JavaScript的事件循環

  • ##Node.js事件循環

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的生命週期詳解感興趣的也請移步我的另一篇專欄)

從源碼解讀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屬性的propevent屬性來進行自訂。原生的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演算法,同樣情況下可以減少移動節點次數,減少不必要的效能損耗,更加的優雅。

Vue3.x借鑒了
ivi演算法和inferno演算法

在創建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組件通訊有哪些方式?
  • 父子元件通訊父->子props,子->父

    $on、$emit

    取得父子元件實例

    $parent、$children

    #Ref

    取得實例的方式呼叫元件的屬性或方法

    Provide、inject
  • 官方不建議使用,但是寫入元件庫時很常用
  • 兄弟元件通訊Event Bus 實作跨元件通訊

    Vue.prototype.$bus = new Vue

    Vuex
  • 跨級元件通訊

    Vuex

    $attrs、$listeners

    #Provide、inject

#18 .SSR了解嗎?

SSR也就是服務端渲染,
也就是將Vue在客戶端把標籤渲染成HTML的工作放在服務端完成,然後再把html直接回傳給客戶端

SSR有著更好的SEO、且首屏載入速度更快等優點。不過它也有一些缺點,例如我們的開發條件會受到限制,伺服器端渲染只支援beforeCreate

created

兩個鉤子,當我們需要一些外部擴充程式庫時需要特殊處理,服務端渲染應用程式也需要處於Node.js的運作環境。還有就是伺服器會有更大的負載需求。

19.你都做過哪些Vue的效能最佳化?

編碼階段

  • #盡量減少data中的數據,data中的資料都會增加getter和setter,會收集對應的watcher
  • v-if和v-for不能連用
  • 如果需要使用v-for給每項元素綁定事件時使用事件代理
  • SPA 頁面採用keep-alive快取元件
  • 在更多的情況下,使用v-if取代v-show
  • key保證唯一
  • 使用路由懶加載、非同步組件
  • 防手震、節流
  • 第三方模組按需導入
  • 長列表捲動至視覺區域動態載入
圖片懶載入

SEO最佳化

  • #預先渲染
服務端渲染SSR

打包優化

  • 壓縮程式碼
  • Tree Shaking/Scope Hoisting
  • 使用cdn加載第三方模組
  • 多執行緒打包happypack
  • splitChunks抽離公共檔案
sourceMap優化

##使用者體驗

  • 骨架螢幕
  • PWA

#也可以使用快取(客戶端快取、服務端快取)來最佳化、服務端開啟gzip壓縮等。

(優化是個大工程,會涉及很多方面,這裡申請另開一個專欄)

20.hash路由和history路由實現原理說一下


location.hash的值實際上是URL中
##後面的東西。

history實際上採用了HTML5中提供的API來實現,主要有history.pushState()history.replaceState()

面試官拿起旁邊已經涼透的咖啡,喝了一口。

(我難道問不倒這小子了麼)

更多程式相關知識,請造訪:程式設計影片

! ! ###

以上是20+道必知必會的Vue面試題(附答案解析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
Netflix的前端:React(或VUE)的示例和應用Netflix的前端:React(或VUE)的示例和應用Apr 16, 2025 am 12:08 AM

Netflix使用React作為其前端框架。 1)React的組件化開發模式和強大生態系統是Netflix選擇它的主要原因。 2)通過組件化,Netflix將復雜界面拆分成可管理的小塊,如視頻播放器、推薦列表和用戶評論。 3)React的虛擬DOM和組件生命週期優化了渲染效率和用戶交互管理。

前端景觀:Netflix如何處理其選擇前端景觀:Netflix如何處理其選擇Apr 15, 2025 am 12:13 AM

Netflix在前端技術上的選擇主要集中在性能優化、可擴展性和用戶體驗三個方面。 1.性能優化:Netflix選擇React作為主要框架,並開發了SpeedCurve和Boomerang等工具來監控和優化用戶體驗。 2.可擴展性:他們採用微前端架構,將應用拆分為獨立模塊,提高開發效率和系統擴展性。 3.用戶體驗:Netflix使用Material-UI組件庫,通過A/B測試和用戶反饋不斷優化界面,確保一致性和美觀性。

React與Vue:Netflix使用哪個框架?React與Vue:Netflix使用哪個框架?Apr 14, 2025 am 12:19 AM

NetflixusesAcustomFrameworkcalled“ Gibbon” BuiltonReact,notReactorVuedIrectly.1)TeamSperience:selectBasedonFamiliarity.2)ProjectComplexity:vueforsimplerprojects:reactforforforproproject,reactforforforcompleplexones.3)cocatizationneedneeds:reactoffipicatizationneedneedneedneedneedneeds:reactoffersizationneedneedneedneedneeds:reactoffersizatization needefersmoreflexibleise.4)

框架的選擇:是什麼推動了Netflix的決定?框架的選擇:是什麼推動了Netflix的決定?Apr 13, 2025 am 12:05 AM

Netflix在框架選擇上主要考慮性能、可擴展性、開發效率、生態系統、技術債務和維護成本。 1.性能與可擴展性:選擇Java和SpringBoot以高效處理海量數據和高並發請求。 2.開發效率與生態系統:使用React提升前端開發效率,利用其豐富的生態系統。 3.技術債務與維護成本:選擇Node.js構建微服務,降低維護成本和技術債務。

反應,vue和Netflix前端的未來反應,vue和Netflix前端的未來Apr 12, 2025 am 12:12 AM

Netflix主要使用React作為前端框架,輔以Vue用於特定功能。 1)React的組件化和虛擬DOM提升了Netflix應用的性能和開發效率。 2)Vue在Netflix的內部工具和小型項目中應用,其靈活性和易用性是關鍵。

前端中的vue.js:現實世界的應用程序和示例前端中的vue.js:現實世界的應用程序和示例Apr 11, 2025 am 12:12 AM

Vue.js是一種漸進式JavaScript框架,適用於構建複雜的用戶界面。 1)其核心概念包括響應式數據、組件化和虛擬DOM。 2)實際應用中,可以通過構建Todo應用和集成VueRouter來展示其功能。 3)調試時,建議使用VueDevtools和console.log。 4)性能優化可通過v-if/v-show、列表渲染優化和異步加載組件等實現。

vue.js和React:了解關鍵差異vue.js和React:了解關鍵差異Apr 10, 2025 am 09:26 AM

Vue.js適合小型到中型項目,而React更適用於大型、複雜應用。 1.Vue.js的響應式系統通過依賴追踪自動更新DOM,易於管理數據變化。 2.React採用單向數據流,數據從父組件流向子組件,提供明確的數據流向和易於調試的結構。

vue.js vs.反應:特定於項目的考慮因素vue.js vs.反應:特定於項目的考慮因素Apr 09, 2025 am 12:01 AM

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),