真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

常見Vue面試題及答案有哪些

這篇文章主要介紹“常見Vue面試題及答案有哪些”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“常見Vue面試題及答案有哪些”文章能幫助大家解決問題。

站在用戶的角度思考問題,與客戶深入溝通,找到岳麓網(wǎng)站設(shè)計與岳麓網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋岳麓地區(qū)。

Vue 常見面試題總結(jié)

MVVM模型?

MVVM,是Model-View-ViewModel的簡寫,其本質(zhì)是MVC模型的升級版。其中 Model 代表數(shù)據(jù)模型,View 代表看到的頁面,ViewModelViewModel之間的橋梁,數(shù)據(jù)會綁定到ViewModel層并自動將數(shù)據(jù)渲染到頁面中,視圖變化的時候會通知ViewModel層更新數(shù)據(jù)。以前是通過操作DOM來更新視圖,現(xiàn)在是數(shù)據(jù)驅(qū)動視圖

Vue的生命周期

每個 Vue 組件實例在創(chuàng)建后都會經(jīng)過一系列的初始化過程,這個過程中會運行叫做生命周期鉤子的函數(shù),以便于用戶在特定的階段有機會添加自己的代碼。

Vue 的生命周期可以分為8個階段:創(chuàng)建前后、掛載前后、更新前后、銷毀前后,以及一些特殊場景的生命周期。Vue 3 中還新增了是3個用于調(diào)試和服務(wù)端渲染的場景?!鞠嚓P(guān)推薦:vuejs視頻教程、web前端開發(fā)】

Vue 2中的生命周期Vue 3中的生命周期描述
beforeCreatebeforeCreate創(chuàng)建前,此時datamethods的數(shù)據(jù)都還沒有初始化
createdcreated創(chuàng)建后,data中有值,尚未掛載,可以進行一些Ajax請求
beforeMountbeforeMount掛載前,會找到虛擬DOM,編譯成Render
mountedmounted掛載后,DOM已創(chuàng)建,可用于獲取訪問數(shù)據(jù)和DOM元素
beforeUpdatebeforeUpdate更新前,可用于獲取更新前各種狀態(tài)
updatedupdated更新后,所有狀態(tài)已是最新
beforeDestroybeforeUnmount銷毀前,可用于一些定時器或訂閱的取消
destroyedunmounted銷毀后,可用于一些定時器或訂閱的取消
activatedactivatedkeep-alive緩存的組件激活時
deactivateddeactivatedkeep-alive緩存的組件停用時
errorCapturederrorCaptured捕獲一個來自子孫組件的錯誤時調(diào)用
renderTracked調(diào)試鉤子,響應(yīng)式依賴被收集時調(diào)用
renderTriggered調(diào)試鉤子,響應(yīng)式依賴被觸發(fā)時調(diào)用
serverPrefetch組件實例在服務(wù)器上被渲染前調(diào)用

父子組件的生命周期:

  • 加載渲染階段:父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted

  • 更新階段:父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated

  • 銷毀階段:父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed

Vue.$nextTick

在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個方法,獲取更新后的 DOM。

nextTick 是 Vue 提供的一個全局 API,由于 Vue 的異步更新策略,導(dǎo)致我們對數(shù)據(jù)修改后不會直接體現(xiàn)在 DOM 上,此時如果想要立即獲取更新后的 DOM 狀態(tài),就需要借助該方法。

Vue 在更新 DOM 時是異步執(zhí)行的。當(dāng)數(shù)據(jù)發(fā)生變化,Vue 將開啟一個異步更新隊列,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)變更。如果同一個 watcher 被多次觸發(fā),只會被推入隊列一次。這種在緩沖時去除重復(fù)數(shù)據(jù)對于避免不必要的計算和 DOM 操作是非常重要的。nextTick方法會在隊列中加入一個回調(diào)函數(shù),確保該函數(shù)在前面的 DOM 操作完成后才調(diào)用。

使用場景:

  • 如果想要在修改數(shù)據(jù)后立刻得到更新后的DOM結(jié)構(gòu),可以使用Vue.nextTick()

  • created生命周期中進行DOM操作

Vue 實例掛載過程中發(fā)生了什么?

掛載過程指的是 app.mount()過程,這是一個初始化過程,整體上做了兩件事情:初始化建立更新機制。

初始化會創(chuàng)建組件實例、初始化組件狀態(tài)、創(chuàng)建各種響應(yīng)式數(shù)據(jù)。

建立更新機制這一步會立即執(zhí)行一次組件的更新函數(shù),這會首次執(zhí)行組件渲染函數(shù)并執(zhí)行patchvnode 轉(zhuǎn)換為 dom; 同時首次執(zhí)行渲染函數(shù)會創(chuàng)建它內(nèi)部響應(yīng)式數(shù)據(jù)和組件更新函數(shù)之間的依賴關(guān)系,這使得以后數(shù)據(jù)發(fā)生變化時會執(zhí)行對應(yīng)的更新函數(shù)。

Vue 的模版編譯原理

Vue 中有個獨特的編譯器模塊,稱為compiler,它的主要作用是將用戶編寫的template編譯為js中可執(zhí)行的render函數(shù)。
在Vue 中,編譯器會先對template進行解析,這一步稱為parse,結(jié)束之后得到一個JS對象,稱之為抽象語法樹AST;然后是對AST進行深加工的轉(zhuǎn)換過程,這一步稱為transform,最后將前面得到的AST生成JS代碼,也就是render函數(shù)。

Vue 的響應(yīng)式原理

  • Vue 2 中的數(shù)據(jù)響應(yīng)式會根據(jù)數(shù)據(jù)類型做不同的處理。如果是對象,則通過Object.defineProperty(obj,key,descriptor)攔截對象屬性訪問,當(dāng)數(shù)據(jù)被訪問或改變時,感知并作出反應(yīng);如果是數(shù)組,則通過覆蓋數(shù)組原型的方法,擴展它的7個變更方法(push、pop、shift、unshift、splice、sort、reverse),使這些方法可以額外的做更新通知,從而做出響應(yīng)。
    缺點:

    • 初始化時的遞歸遍歷會造成性能損失;

    • 通知更新過程需要維護大量 dep 實例和 watcher 實例,額外占用內(nèi)存較多;

    • 新增或刪除對象屬性無法攔截,需要通過 Vue.setdelete 這樣的 API 才能生效;

    • 對于ES6中新產(chǎn)生的Map、Set這些數(shù)據(jù)結(jié)構(gòu)不支持。

  • Vue 3 中利用ES6Proxy機制代理需要響應(yīng)化的數(shù)據(jù)??梢酝瑫r支持對象和數(shù)組,動態(tài)屬性增、刪都可以攔截,新增數(shù)據(jù)結(jié)構(gòu)均支持,對象嵌套屬性運行時遞歸,用到時才代理,也不需要維護特別多的依賴關(guān)系,性能取得很大進步。

虛擬DOM

  • 概念:
    虛擬DOM,顧名思義就是虛擬的DOM對象,它本身就是一個JS對象,只不過是通過不同的屬性去描述一個視圖結(jié)構(gòu)。

  • 虛擬DOM的好處:
    (1) 性能提升
    直接操作DOM是有限制的,一個真實元素上有很多屬性,如果直接對其進行操作,同時會對很多額外的屬性內(nèi)容進行了操作,這是沒有必要的。如果將這些操作轉(zhuǎn)移到JS對象上,就會簡單很多。另外,操作DOM的代價是比較昂貴的,頻繁的操作DOM容易引起頁面的重繪和回流。如果通過抽象VNode進行中間處理,可以有效減少直接操作DOM次數(shù),從而減少頁面的重繪和回流。
    (2) 方便跨平臺實現(xiàn)
    同一VNode節(jié)點可以渲染成不同平臺上對應(yīng)的內(nèi)容,比如:渲染在瀏覽器是DOM元素節(jié)點,渲染在Native(iOS、Android)變?yōu)閷?yīng)的控件。Vue 3 中允許開發(fā)者基于VNode實現(xiàn)自定義渲染器(renderer),以便于針對不同平臺進行渲染。

  • 結(jié)構(gòu):
    沒有統(tǒng)一的標(biāo)準(zhǔn),一般包括tagprops、children三項。
    tag:必選。就是標(biāo)簽,也可以是組件,或者函數(shù)。
    props:非必選。就是這個標(biāo)簽上的屬性和方法。
    children:非必選。就是這個標(biāo)簽的內(nèi)容或者子節(jié)點。如果是文本節(jié)點就是字符串;如果有子節(jié)點就是數(shù)組。換句話說,如果判斷children是字符串的話,就表示一定是文本節(jié)點,這個節(jié)點肯定沒有子元素。

diff 算法

1、概念:

diff算法是一種對比算法,通過對比舊的虛擬DOM和新的虛擬DOM,得出是哪個虛擬節(jié)點發(fā)生了改變,找出這個虛擬節(jié)點并只更新這個虛擬節(jié)點所對應(yīng)的真實節(jié)點,而不用更新其他未發(fā)生改變的節(jié)點,實現(xiàn)精準(zhǔn)地更新真實DOM,進而提高效率。

2、對比方式:

diff算法的整體策略是:深度優(yōu)先,同層比較。比較只會在同層級進行, 不會跨層級比較;比較的過程中,循環(huán)從兩邊向中間收攏。

  • 首先判斷兩個節(jié)點的tag是否相同,不同則刪除該節(jié)點重新創(chuàng)建節(jié)點進行替換。

  • tag相同時,先替換屬性,然后對比子元素,分為以下幾種情況:

    • 新舊節(jié)點都有子元素時,采用雙指針方式進行對比。新舊頭尾指針進行比較,循環(huán)向中間靠攏,根據(jù)情況調(diào)用patchVnode進行patch重復(fù)流程、調(diào)用createElem創(chuàng)建一個新節(jié)點,從哈希表尋找 key一致的VNode節(jié)點再分情況操作。

    • 新節(jié)點有子元素,舊節(jié)點沒有子元素,則將子元素虛擬節(jié)點轉(zhuǎn)化成真實節(jié)點插入即可。

    • 新節(jié)點沒有子元素,舊節(jié)點有子元素,則清空子元素,并設(shè)置為新節(jié)點的文本內(nèi)容。

    • 新舊節(jié)點都沒有子元素時,即都為文本節(jié)點,則直接對比文本內(nèi)容,不同則更新。

Vue中key的作用?

key的作用主要是為了更加高效的更新虛擬 DOM。

Vue 判斷兩個節(jié)點是否相同時,主要是判斷兩者的key元素類型tag。因此,如果不設(shè)置key,它的值就是 undefined,則可能永遠(yuǎn)認(rèn)為這是兩個相同的節(jié)點,只能去做更新操作,將造成大量的 DOM 更新操作。

為什么組件中的 data 是一個函數(shù)?

在 new Vue() 中,可以是函數(shù)也可以是對象,因為根實例只有一個,不會產(chǎn)生數(shù)據(jù)污染。

在組件中,data 必須為函數(shù),目的是為了防止多個組件實例對象之間共用一個 data,產(chǎn)生數(shù)據(jù)污染;而采用函數(shù)的形式,initData 時會將其作為工廠函數(shù)都會返回全新的 data 對象。

Vue 中組件間的通信方式?

  • 父子組件通信:

    父向子傳遞數(shù)據(jù)是通過props,子向父是通過$emit觸發(fā)事件;通過父鏈/子鏈也可以通信($parent/$children);ref也可以訪問組件實例;provide/inject;$attrs/$listeners。

  • 兄弟組件通信:

    全局事件總線EventBus、Vuex

  • 跨層級組件通信:

    全局事件總線EventBus、Vuex、provide/inject。

v-show 和 v-if 的區(qū)別?

  • 控制手段不同。v-show是通過給元素添加 css 屬性display: none,但元素仍然存在;而v-if控制元素顯示或隱藏是將元素整個添加或刪除。

  • 編譯過程不同。v-if切換有一個局部編譯/卸載的過程,切換過程中合適的銷毀和重建內(nèi)部的事件監(jiān)聽和子組件;v-show只是簡單的基于 css 切換。

  • 編譯條件不同。v-if是真正的條件渲染,它會確保在切換過程中條件塊內(nèi)的事件監(jiān)聽器和子組件適當(dāng)?shù)乇讳N毀和重建,渲染條件為假時,并不做操作,直到為真才渲染。

  • 觸發(fā)生命周期不同。v-show由 false 變?yōu)?true 的時候不會觸發(fā)組件的生命周期;v-if由 false 變?yōu)?true 的時候,觸發(fā)組件的beforeCreate、createdbeforeMount、mounted鉤子,由 true 變?yōu)?false 的時候觸發(fā)組件的beforeDestorydestoryed鉤子。

  • 性能消耗不同。v-if有更高的切換消耗;v-show有更高的初始渲染消耗。

使用場景:
如果需要非常頻繁地切換,則使用v-show較好,如:手風(fēng)琴菜單,tab 頁簽等; 如果在運行時條件很少改變,則使用v-if較好,如:用戶登錄之后,根據(jù)權(quán)限不同來顯示不同的內(nèi)容。

computed 和 watch 的區(qū)別?

  • computed計算屬性,依賴其它屬性計算值,內(nèi)部任一依賴項的變化都會重新執(zhí)行該函數(shù),計算屬性有緩存,多次重復(fù)使用計算屬性時會從緩存中獲取返回值,計算屬性必須要有return關(guān)鍵詞。

  • watch偵聽到某一數(shù)據(jù)的變化從而觸發(fā)函數(shù)。當(dāng)數(shù)據(jù)為對象類型時,對象中的屬性值變化時需要使用深度偵聽deep屬性,也可在頁面第一次加載時使用立即偵聽immdiate屬性。

運用場景:
計算屬性一般用在模板渲染中,某個值是依賴其它響應(yīng)對象甚至是計算屬性而來;而偵聽屬性適用于觀測某個值的變化去完成一段復(fù)雜的業(yè)務(wù)邏輯。

v-if 和 v-for 為什么不建議放在一起使用?

Vue 2 中,v-for的優(yōu)先級比v-if高,這意味著v-if將分別重復(fù)運行于每一個v-for循環(huán)中。如果要遍歷的數(shù)組很大,而真正要展示的數(shù)據(jù)很少時,將造成很大的性能浪費。

Vue 3 中,則完全相反,v-if的優(yōu)先級高于v-for,所以v-if執(zhí)行時,它調(diào)用的變量還不存在,會導(dǎo)致異常。

通常有兩種情況導(dǎo)致要這樣做:

  • 為了過濾列表中的項目,比如:v-for = "user in users" v-if = "user.active"。這種情況,可以定義一個計算屬性,讓其返回過濾后的列表即可。

  • 為了避免渲染本該被隱藏的列表,比如v-for = "user in users"  v-if = "showUsersFlag"。這種情況,可以將v-if移至容器元素上或在外面包一層template即可。

$set

可手動添加響應(yīng)式數(shù)據(jù),解決數(shù)據(jù)變化視圖未更新問題。當(dāng)在項目中直接設(shè)置數(shù)組的某一項的值,或者直接設(shè)置對象的某個屬性值,會發(fā)現(xiàn)頁面并沒有更新。這是因為Object.defineProperty()的限制,監(jiān)聽不到數(shù)據(jù)變化,可通過this.$set(數(shù)組或?qū)ο?,?shù)組下標(biāo)或?qū)ο蟮膶傩悦?,更新后的?解決。

keep-alive 是什么?

  • 作用:實現(xiàn)組件緩存,保持組件的狀態(tài),避免反復(fù)渲染導(dǎo)致的性能問題。

  • 工作原理:Vue.js 內(nèi)部將 DOM 節(jié)點,抽象成了一個個的 VNode 節(jié)點,keep-alive組件的緩存也是基于 VNode 節(jié)點的。它將滿足條件的組件在 cache 對象中緩存起來,重新渲染的時候再將 VNode 節(jié)點從 cache 對象中取出并渲染。

  • 可以設(shè)置以下屬性:
    include:字符串或正則,只有名稱匹配的組件會被緩存。
    exclude:字符串或正則,任何名稱匹配的組件都不會被緩存。
    max:數(shù)字,最多可以緩存多少組件實例。
    匹配首先檢查組件的name選項,如果name選項不可用,則匹配它的局部注冊名稱(父組件 components選項的鍵值),匿名組件不能被匹配。

設(shè)置了keep-alive緩存的組件,會多出兩個生命周期鉤子:activated、deactivated
首次進入組件時:beforeCreate --> created --> beforeMount --> mounted --> activated --> beforeUpdate --> updated --> deactivated
再次進入組件時:activated --> beforeUpdate --> updated --> deactivated

mixin

mixin(混入), 它提供了一種非常靈活的方式,來分發(fā) Vue 組件中的可復(fù)用功能。

使用場景: 不同組件中經(jīng)常會用到一些相同或相似的代碼,這些代碼的功能相對獨立??梢酝ㄟ^mixin 將相同或相似的代碼提出來。

劣勢:

  • 變量來源不明確

  • 多 mixin 可能會造成命名沖突(解決方式:Vue 3的組合API)

  • mixin 和組件坑出現(xiàn)多對的的關(guān)系,使項目復(fù)雜度變高。

插槽

slot插槽,一般在組件內(nèi)部使用,封裝組件時,在組件內(nèi)部不確定該位置是以何種形式的元素展示時,可以通過slot占據(jù)這個位置,該位置的元素需要父組件以內(nèi)容形式傳遞過來。slot分為:

  • 默認(rèn)插槽:子組件用標(biāo)簽來確定渲染的位置,標(biāo)簽里面可以放DOM結(jié)構(gòu)作為后備內(nèi)容,當(dāng)父組件在使用的時候,可以直接在子組件的標(biāo)簽內(nèi)寫入內(nèi)容,該部分內(nèi)容將插入子組件的標(biāo)簽位置。如果父組件使用的時候沒有往插槽傳入內(nèi)容,后備內(nèi)容就會顯示在頁面。

  • 具名插槽:子組件用name屬性來表示插槽的名字,沒有指定name的插槽,會有隱含的名稱叫做 default。父組件中在使用時在默認(rèn)插槽的基礎(chǔ)上通過v-slot指令指定元素需要放在哪個插槽中,v-slot值為子組件插槽name屬性值。使用v-slot指令指定元素放在哪個插槽中,必須配合