搜尋
首頁頭條37個常見Vue面試題,增強你的Vue知識儲備!

這篇文章給大家總結分享37個常見Vue面試題,帶你鞏固一波地基,增強你的Vue知識儲備,背就完事了!

37個常見Vue面試題,增強你的Vue知識儲備!

相關推薦:2022年大前端面試題總結(收藏)

一、談你對MVVM的理解?

映射關係簡化,隱藏controller MVVM在MVC的基礎上,把控制層隱藏掉了。

37個常見Vue面試題,增強你的Vue知識儲備!

Vue不是MVVM框架,它是視圖層框架。 【相關推薦:vue.js影片教學

ViewModal是一個橋樑,將資料和視圖進行關聯。

二、談談你對Vue中響應式資料的理解?

數組和物件類型的值變化的時候,透過defineReactive方法,借助了defineProperty,將所有的屬性添加了gettersetter。使用者在取值和設定的時候,可以進行一些操作。

缺陷:只能監控最外層的屬性,如果是多層的,就要進行全量遞迴。

get裡面會做依賴蒐集(dep[watcher, watcher]) set裡面會做資料更新(notify,通知watcher更新)

三、Vue中如何偵測陣列的變化?

vue中對陣列沒有進行defineProperty,而是重寫了陣列的7個方法。 分別是:

  • push
  • shift
  • pop
  • splice
  • unshift
  • sort
  • reverse

因為這些方法都會改變陣列本身。

陣列裡的索引和長度是無法被監控的。

四、Vue中如何進行依賴收集的?

37個常見Vue面試題,增強你的Vue知識儲備!

Vue初始化的時候,掛載之後會進行編譯。產生renderFunction。

當取值的時候,就會蒐集watcher,放到dep裡面。

當使用者更改值的時候,就會通知watcher,去更新視圖。

五、如何理解Vue中的模板編譯原理?

這個問題的核心是如何將template轉換成render函數。

  1. 將template模組轉換成ast語法書- parserHTML
  2. 對靜態語法做標記(某些節點不改變)
  3. 重新產生程式碼- codeGen,使用with語法包裹字串

六、Vue生命週期鉤子是如何實現的?

#Vue的生命週期鉤子是回調函數,當創建元件實例的過程中會呼叫相應的鉤子方法。 內部會對鉤子進行處理,將鉤子函數維護成陣列的形式。

七、Vue元件生命週期有哪些?

  • beforeCreate 在實例初始化之後,資料觀測observer 和event、watcher事件配置之前被呼叫
  • created 實例已經建立完成,在這一步,以下配置被完成
    • 資料觀測
    • 屬性與方法的運算
    • watch/event時間回呼
    • $el尚未產生
  • beforeMount在掛載之前被調用,render尚未被調用
  • mounted el被新創建的vm.$el替換,並掛載到實例上去之後調用
  • beforeUpdate 資料更新時,被調用,發生在虛擬Dom重新渲染和打補丁之前
  • update 由於資料更改導致的虛擬Dom重新渲染和打補丁,在這之後調用
  • beforeDestroy 實例銷毀之前調用
  • destroyed 實例銷毀之後調用,調用後Vue實例的所有東西都會被解綁,所有的事件監聽會被移除,子實例被銷毀,該鉤子在服務端渲染期間不被調用
  • # keep-alive(activated & deactivated)

八、vue.mixin的使用場景和原理?

Vue的mixin的作用就是抽離公共的業務邏輯,原理類似對象的繼承,當元件初始化的時候,會呼叫mergeOptions方法進行合併,採用策略模式針對不同的屬性進行合併。 如果混入的資料和本身組件的資料有衝突,則採用本身的資料為準。

缺點:命名衝突、資料來源不清晰

九、Vue的元件data為什麼必須是一個函數?

new Vue是一個單範例模式,不會有任何的合併操作,所以根實例不必校驗data一定是函數。 元件的data必須是一個函數,是為了防止兩個元件的資料產生污染。 如果都是物件的話,會在合併的時候,指向同一個位址。 而如果是函數的時候,合併的時候調用,會產生兩個空間。

十、請說明nextTick的原理。

nextTick是一個微任務。

  • nextTick中的回呼是在下次Dom更新循環結束之後執行的延遲回調
  • 可以用來取得更新後的Dom
  • Vue中的資料更新是異步的,使用nextTick可以保證使用者定義的邏輯在更新之後執行

十一、computed和watch的差異是什麼?

  • computed和watch都是基於watcher來實現的。
  • computed的屬性是具備快取的,依賴的值不會發生變化,對其取值時計算屬性方法不會重複執行
  • watch是監控值的變化,當值改變的時候,會呼叫回呼函數

十二、Vue.set方法是如何實現的?

  • vue為物件和陣列本身都增加了dep屬性
  • 當給物件新增不存在的屬性的時候,就會觸發物件依賴的watcher去更新
  • 當修改數組索引的時候,就呼叫數組本身的splice方法去更新數組

十三、Vue為什麼要用虛擬Dom

  • 虛擬dom就是用js物件來描述真實Dom,是對真實Dom的抽象
  • 由於直接操作Dom效能低,但是js層的操作效率高,可以將Dom操作轉換成物件運算。最後透過diff演算法比對差異進行更新Dom
  • 虛擬Dom不依賴真實平台環境,可以實現跨平台

#十四、Vue的diff演算法原理是什麼?

Vue的diff演算法是平階比較,不考慮跨層級比較的情況。內部採用深度遞歸的方式雙指標方式比較

  • 先比較兩個節點是不是相同節點
  • 相同節點比較屬性,再用舊節點
  • 先比較兒子節點,考慮舊節點和新節點兒子的情況
  • 優化比較:頭頭、尾尾、頭尾、尾頭
  • 比對查找,進行複用

十五、既然vue透過資料劫持可以精準的探測資料變化,為什麼還要進行diff偵測差異?

  • 響應式資料變化,Vue確實可以在資料變化的時候,響應式系統可以立刻得知。但是如何每個屬性都加上watcher的話,效能會非常的差。
  • 粒度過細,會導致更新不精確

所以採用watcher Diff演算法來偵測差異。

十六、請說明key的作用和原則

  • Vue在patch過程中,透過key可以判斷兩個虛擬節點是否為相同節點。
  • 沒有key會導致更新的時候出問題
  • 盡量不要採用索引作為key

37個常見Vue面試題,增強你的Vue知識儲備!

十七、談談對元件的理解

  • 元件化開發能大幅提升應用開發效率、測試性、重複使用性
  • 常用的元件化技術:屬性、自訂事件、插槽
  • 降低更新範圍,值重新渲染變化的元件
  • 高內聚、低耦合、單向資料流

11、請描述元件的渲染流程

產生元件虛擬節點-> 建立元件的真實節點-> 插入到頁面

37個常見Vue面試題,增強你的Vue知識儲備!

#、請描述元件的更新流程

屬性更新會觸發patchVnode方法,元件的虛擬節點會呼叫prepatch鉤子,然後更新屬性,更新元件。

37個常見Vue面試題,增強你的Vue知識儲備!

二十、非同步元件原則

先渲染非同步佔位節點 -> 元件載入完畢後呼叫forceUpdate強制更新。

二十一、函數元件的優勢與原理

  • 函數式元件的特性:無狀態、無生命週期、無this。因此性能會高一點。

正常的一個元件是一個類別繼承了Vue。

函數式元件,就是一個普通的函數。

二十二、元件的傳值方式有哪些?

  1. props和emit:父元件向子元件傳遞數據,透過pr##op傳遞。子元件傳遞資料給父元件是透過emit: 父元件向子元件傳遞數據,透過prop傳遞。子元件傳遞資料給父元件是透過##過
  2. ##過emit事件parenre
  3. #nt,children取得目前元件的父元件和目前元件的子元件attrtr
  4. s
  5. #和
  6. listeners 。

父元件透過provide提供,子元件透過inject注入變數

$ref取得實例

eventBus平階元件資料傳遞

Vuex

#二十三、$attrs是為了解決什麼問題出現的?

主要作用是為了實作批量傳遞資料。 ######provide/inject更適合應用在外掛程式中,主要實現跨層級資料傳遞。 ######二十四、v-for和v-if哪個優先權比較高? ######首先,v-for和v-if 不能在同一個標籤中使用。 ######先處理v-for,再處理v-if。 ###

如果同時遇到的時候,應該考慮先用計算屬性處理數據,在進行v-for,可以減少循環次數。

二十五、v-mode是如何實現的?

在元件上用的v-model,是model和callback

37個常見Vue面試題,增強你的Vue知識儲備!

#在普通元素上用v-model,會產生指令,也可能因為不同的元素:

  • 產生value和input
  • 產生change和radio
  • 產生change和checked

37個常見Vue面試題,增強你的Vue知識儲備!

指令在什麼時候會呼叫?

37個常見Vue面試題,增強你的Vue知識儲備!

源碼:

37個常見Vue面試題,增強你的Vue知識儲備!

#二十六、Vue的普通Slot以及作用域Slot的區別

普通插槽

普通插槽是渲染後做替換的工作。父元件渲染完畢後,替換子元件的內容。

37個常見Vue面試題,增強你的Vue知識儲備!

在模板編譯的時候,處理元件中的子節點和slot標籤

137個常見Vue面試題,增強你的Vue知識儲備!

在建立元素的時候,用_t()方法方法來取代_v()的內容。

137個常見Vue面試題,增強你的Vue知識儲備!

作用域插槽

作用域插槽可以拿到子元件裡面的屬性。在子元件中傳入屬性然後渲染。

137個常見Vue面試題,增強你的Vue知識儲備!

137個常見Vue面試題,增強你的Vue知識儲備!

作用域插槽的編譯結果:

137個常見Vue面試題,增強你的Vue知識儲備!

137個常見Vue面試題,增強你的Vue知識儲備!

二十八、Vue.use是做什麼的?

Vue.use是用來使用外掛的。我們可以在插件中擴展全域元件、指令、原型方法等。 會呼叫install方法將Vue的建置函數預設傳入,在外掛程式中可以使用vue,無需依賴vue函式庫

137個常見Vue面試題,增強你的Vue知識儲備!

二十九、元件寫name有啥好處?

  • 增加name屬性,會在components屬性中增加元件本身,實作元件的遞歸呼叫。
  • 可以表示元件的具體名稱,方便偵錯和尋找對應的元件。

三十、vue的修飾符有哪些?

  • .stop
  • .prevent
  • .capture
  • .self
  • .once
  • . passive
  • .right
  • .center
  • .middle
  • .alt

三十一、如何理解自訂指令?

  • 在產生ast語法樹時,遇到指令會為目前元素加上directives屬性
  • #透過genDirectives產生指令碼
  • 在patch前,將指令的鉤子提取到cbs中,在patch過程中調用對應的鉤子
  • 當執行cbs對應的鉤子時,調用對應指令定義方法

#三十二、keep-alive平時在哪裡使用?原理是什麼?

  • 使用keep-alive包裹動態元件時,會對元件進行緩存,避免元件重新建立

使用有兩個場景,一個是動態元件,一個是router-view

137個常見Vue面試題,增強你的Vue知識儲備!

這裡建立了一個白名單和一個黑名單。表示哪些需要需要做緩存,哪些不需要做快取。以及最大的快取個數。

137個常見Vue面試題,增強你的Vue知識儲備!

快取的是元件的實例,用key和value物件儲存。

載入的時候,監控include和exclude。

37個常見Vue面試題,增強你的Vue知識儲備!

如果不需要緩存,直接回傳虛擬節點。

如果需要緩存,就用元件的id和標籤名,產生一個key,把目前vnode的instance當作value,存成一個物件。這就是快取清單

如果設定了最大的快取數,就刪除第0個快取。新增最新的快取。

並且為元件加上keepAlive變數為true,當元件初始化的時候,就不再初始化。

三十三、vue-router有幾個鉤子函數?執行流程如何?

鉤子函數有三種:

  • 全域守衛
  • 路由守衛
  • 元件守衛

237個常見Vue面試題,增強你的Vue知識儲備!

三十四、vuerouter的兩種模式的區別

  • vue-router中有三種模式,分別是hash、history、abstract
  • abstract在不支援瀏覽器的API換景使用
  • hash模式相容性好,但不美觀,不利於SEO
  • history美觀,historyAPI popState,但刷新會出現404

#三十五、談談Vue的效能優化有哪些?

  • 資料層級不要過深,合理的設定響應式資料
  • 使用資料時,快取值的結果,不頻繁取值
  • 合理設定key
  • v-show(頻繁切換效能高)和v-if的合理使用
  • 控制元件的粒度-> Vue採用元件層級更新
  • 採用函數式元件- > 函數式組價開銷低
  • 採用非同步元件-> 借助webpack的分包策略
  • 使用keep-alive來快取元件
  • 虛擬滾動、時間分片等策略
  • 打包優化

三十六、談談你對Vuex的理解?

Vuex是專為vue提供的全域狀態管理系統,用於多個元件中的資料共享、資料快取。

問題:無法持久化。

237個常見Vue面試題,增強你的Vue知識儲備!

  • mutation 主要修改狀態,同步執行
  • action 執行業務程式碼,方便重複使用,邏輯可以為非同步。不能直接修改狀態。

三十七、vue中使用了哪些設計模式?

  • 單例模式:new多次,只有一個實例

237個常見Vue面試題,增強你的Vue知識儲備!

  • #工場模式:傳入參數就可以建立實例(虛擬節點的建立)
  • 發布訂閱模式:eventBus
  • 觀察者模式:watch與dep
  • 代理模式:_data屬性、proxy、防手震、節流
  • 中介者模式:vuex
  • 策略模式
  • 外觀模式

原文網址:https://juejin.cn/ post/7043074656047202334

作者:海明月

(學習影片分享:web前端

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

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

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版

SublimeText3 Mac版

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