本文小編為大家詳細(xì)介紹“Vue有哪些高頻面試題”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Vue有哪些高頻面試題”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比錦屏網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式錦屏網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋錦屏地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
這個(gè)問(wèn)題一般問(wèn)的不多,但是如果問(wèn)到了你就必須得答出來(lái)
回答
Vue2(選項(xiàng)式API) | Vue3(setup) | 描述 |
---|---|---|
beforeCreate | - | 實(shí)例創(chuàng)建前 |
created | - | 實(shí)例創(chuàng)建后 |
beforeMount | onBeforeMount | DOM掛載前調(diào)用 |
mounted | onMounted | DOM掛載完成調(diào)用 |
beforeUpdate | onBeforeUpdate | 數(shù)據(jù)更新之前被調(diào)用 |
updated | onUpdated | 數(shù)據(jù)更新之后被調(diào)用 |
beforeDestroy | onBeforeUnmount | 組件銷毀前調(diào)用 |
destroyed | onUnmounted | 組件銷毀完成調(diào)用 |
這個(gè)相對(duì)于上一個(gè)問(wèn)題稍微復(fù)雜一點(diǎn),可以試著理解記憶或者直接記住吧
渲染過(guò)程
父beforeCreate
父created
父beforeMount
子beforeCreate
子created
子beforeMount
子mounted
父mounted
更新過(guò)程
父beforeUpdate
子beforeUpdate
子updated
父updated
銷毀過(guò)程
父beforeDestroy
子beforeDestroy
子destroyed
父destroyed
注意如果子組件是異步組件的話它們的執(zhí)行順序會(huì)發(fā)生改變,會(huì)先執(zhí)行完父組件的生命周期然后再執(zhí)行子組件的生命周期
這個(gè)問(wèn)題算是非?;镜念}了,它也很好理解,面試一般會(huì)問(wèn)這兩個(gè)指令的區(qū)別是什么,以及在什么場(chǎng)景下分別用哪個(gè)指令合適回答
v-if
表示一個(gè)dom元素是否被創(chuàng)建,而v-show
則是控制這個(gè)dom元素的display
屬性是否為none
一般在頻繁切換狀態(tài)的地方使用v-show
,v-if
則更適合條件不經(jīng)常改變的場(chǎng)景,因?yàn)樗袚Q開(kāi)銷相對(duì)較大
這個(gè)問(wèn)題被問(wèn)到的頻率還是比較高的,雖然它在實(shí)際開(kāi)發(fā)中并不會(huì)這么用。
回答
開(kāi)發(fā)過(guò)程中一般不建議同時(shí)將v-for和v-if放在一個(gè)標(biāo)簽中使用
Vue2中v-for的優(yōu)先級(jí)會(huì)更高,所以會(huì)先執(zhí)行循環(huán),再進(jìn)行v-if判斷,所以這樣就會(huì)導(dǎo)致無(wú)論需不需展示這個(gè)元素,都會(huì)先遍歷整個(gè)列表
在Vue3中v-if的優(yōu)先級(jí)會(huì)更高,但是當(dāng)我們遍歷一個(gè)數(shù)組的時(shí)候,根據(jù)數(shù)組中的某個(gè)元素進(jìn)行v-if判斷的時(shí)候就會(huì)報(bào)錯(cuò),因?yàn)関-if會(huì)先執(zhí)行此時(shí)還沒(méi)有拿到這個(gè)數(shù)組。所以Vue3中依然不建議這樣使用
computed和watch實(shí)際工作中用的比較多,所以問(wèn)的也比較多,一般理解了基本都能回答上來(lái)
computed是計(jì)算屬性,當(dāng)一個(gè)屬性受一個(gè)或者多個(gè)屬性影響的時(shí)候可以使用.watch是偵聽(tīng)器,當(dāng)我們需要根據(jù)一個(gè)屬性的變化而做出一些處理的時(shí)候,可以使用watch來(lái)對(duì)這個(gè)屬性進(jìn)行監(jiān)聽(tīng)
computed具有緩存的特點(diǎn),即當(dāng)它所依賴的屬性發(fā)生改變的時(shí)候它才會(huì)重新執(zhí)行內(nèi)部邏輯.如下代碼
頁(yè)面多次使用addSum
,但是只會(huì)打印一次"內(nèi)部邏輯執(zhí)行"
watch在頁(yè)面首次加載的時(shí)候默認(rèn)不會(huì)執(zhí)行,需要設(shè)置immediate:true
首次才會(huì)執(zhí)行監(jiān)聽(tīng)
watch默認(rèn)只監(jiān)聽(tīng)一層數(shù)據(jù),不監(jiān)聽(tīng)多層數(shù)據(jù)里屬性的變化,需要設(shè)置deep:true
才會(huì)進(jìn)行深度監(jiān)聽(tīng)
關(guān)于vue-router
能問(wèn)的問(wèn)題非常多,比如它的實(shí)現(xiàn)原理,路由跳轉(zhuǎn),路由守衛(wèi)等等,所以建議去系統(tǒng)的查看vue-router
文檔
問(wèn)題1:vue-router是什么,描述一下它的原理?
Vue Router是Vue官方的路由管理器,有hash和history兩種模式
hash
模式是通過(guò)監(jiān)聽(tīng)hashchange
事件來(lái)實(shí)現(xiàn)更新頁(yè)面部分內(nèi)容的操作,url后面會(huì)帶有#
號(hào)
history
模式則是通過(guò)監(jiān)聽(tīng)popstate
事件來(lái)實(shí)現(xiàn)更新頁(yè)面部分內(nèi)容的操作原理和hash
模式差不多,只不過(guò)url后面不會(huì)出現(xiàn)#
會(huì)顯得更加美觀。同時(shí)會(huì)帶來(lái)一個(gè)問(wèn)題,因?yàn)闆](méi)有#
號(hào),所以當(dāng)用戶刷新頁(yè)面時(shí)會(huì)向服務(wù)器發(fā)請(qǐng)求導(dǎo)致請(qǐng)求資源為404,因此需要對(duì)nginx
進(jìn)行一個(gè)配置,需要把所有路由都重定向到根頁(yè)面
問(wèn)題2:路由跳轉(zhuǎn)方式有哪些?
內(nèi)置組件跳轉(zhuǎn)
router.push({ path: '/home' })
,router.replace({ path: '/home' })
問(wèn)題3:說(shuō)一下路由守衛(wèi)?
路由守衛(wèi)分為全局路由守衛(wèi),路由獨(dú)享守衛(wèi),組件路由守衛(wèi)
全局路由守衛(wèi)
beforeEach
,接收to、from、next
三個(gè)參數(shù),每個(gè)路由跳轉(zhuǎn)前都會(huì)觸發(fā),登錄驗(yàn)證時(shí)用的比較多
beforeResolve
,和beforeEach
類似,區(qū)別是在導(dǎo)航被確認(rèn)之前,同時(shí)在所有組件內(nèi)守衛(wèi)和異步路由組件被解析之后調(diào)用
afterEach,在路由跳轉(zhuǎn)完成后調(diào)用,接收to、from兩個(gè)參數(shù)
路由獨(dú)享守衛(wèi)
beforeEnter
,一般配置在路由配置文件中(router/index.js),對(duì)進(jìn)入某個(gè)路由之前進(jìn)行相關(guān)操作
組件路由守衛(wèi)
接收
to、from、next
三個(gè)參數(shù)
beforeRouteEnter
,進(jìn)入該組件之前調(diào)用,無(wú)法獲取到vue實(shí)例
beforeRouteUpdate
,在當(dāng)前路由改變,但是該組件被復(fù)用時(shí)調(diào)用
beforeRouteLeave
, 在離開(kāi)當(dāng)前組件時(shí)調(diào)用
當(dāng)面試問(wèn)你會(huì)用vue3嗎,如果你回答會(huì)用的話,那么大概率會(huì)問(wèn)vue2和vue3有哪些區(qū)別,最近我去面試的時(shí)候百分之90都問(wèn)了這個(gè)問(wèn)題。
回答
寫法上的區(qū)別:vue2使用的是options(選項(xiàng))Api
,vue3的是composition Api
(當(dāng)然vue3也兼容composition api
)。options Api
中methods,compute,data
等api都是分散的。而composition api
中的代碼是根據(jù)邏輯功能來(lái)組織的,我們可以將一個(gè)功能所定義的methods,compute,data
等api會(huì)放在一起,讓我們可以更靈活地組合組件邏輯。
vue2將響應(yīng)式數(shù)據(jù)放到data函數(shù)中,而vue3則是使用ref
和reactive
將數(shù)據(jù)聲明為響應(yīng)式
響應(yīng)式實(shí)現(xiàn)方式:vue2中是通過(guò)Object.defineProperty
對(duì)數(shù)據(jù)劫持實(shí)現(xiàn)的,vue3中則是使用Proxy
對(duì)數(shù)據(jù)代理實(shí)現(xiàn)的。
生命周期區(qū)別:vue3中將beforeCreate
和created
合并到了setup
函數(shù)中
根節(jié)點(diǎn): vue3組件允許多個(gè)根節(jié)點(diǎn),而vue2只允許一個(gè)
內(nèi)置組件: vue3新增了傳送組件Teleport
和異步依賴處理組件Suspense
面試一般會(huì)問(wèn)你如何寫一個(gè)vue插件,所以沒(méi)寫過(guò)vue插件的最好去親自體驗(yàn)一下
回答:
vue
實(shí)例會(huì)有一個(gè)use
函數(shù),它接受的是一個(gè)帶有install
函數(shù)的對(duì)象和一個(gè)可選的選項(xiàng)對(duì)象,當(dāng)我們使用 vue.use(plugin)
或者app.use(plugin)
會(huì)調(diào)用我們插件的install
屬性的函數(shù),并且將當(dāng)前組件的實(shí)例傳進(jìn)來(lái).所以在插件中就可以對(duì)這個(gè)實(shí)例進(jìn)行一些操作來(lái)實(shí)現(xiàn)我們插件的功能
插槽slot
可以理解為占坑,當(dāng)使用一個(gè)組件的時(shí)候,在組件標(biāo)簽里的對(duì)應(yīng)的內(nèi)容就會(huì)替換掉這個(gè)組件中的slot
標(biāo)簽。
插槽分為默認(rèn)插槽
,具名插槽
,作用域插槽
。
默認(rèn)插槽子組件中用slot
標(biāo)簽來(lái)確定渲染位置,父組件使用它時(shí)直接在子組件的標(biāo)簽內(nèi)寫入內(nèi)容即可
//子組件
具名插槽
顧名思義就是具有名字的插槽,子組件中可以用name
熟悉對(duì)slot
命名,父組件在使用的時(shí)候通過(guò)template
中的v-slot:name
或者#name
來(lái)定義這個(gè)插槽中的內(nèi)容
//子組件
作用域插槽
子組件中的slot
可以通過(guò)類似組件屬性傳遞的方式將子組件的值傳遞給父組件中這個(gè)子組件的插槽內(nèi)容中
(子組件標(biāo)簽內(nèi)),在父組件使用子組件的時(shí)候要用v-slot
的值進(jìn)行接收這些參數(shù),默認(rèn)插槽可以將其直接寫在子組件標(biāo)簽上,具名插槽則寫在template
上。而傳過(guò)來(lái)的值只能在子組件標(biāo)簽中或者template
標(biāo)簽中使用。所以在父組件作用域中獲取到了子組件作用域中的變量,可以認(rèn)為作用域插槽延伸了子組件數(shù)據(jù)的作用范圍,因此叫做作用域插槽
如果你想詳細(xì)理解插槽的作用可以閱讀這篇文章Vue3中插槽(slot)用法匯總 - 掘金 (juejin.cn)
這里我大概歸納了一下vue2和vue3的傳參方式
方式 | Vue2 | Vue3 |
---|---|---|
父?jìng)髯?/td> | props | props |
子傳父 | $emit | emits |
父?jìng)髯?/td> | $attrs | attrs |
子傳父 | $listeners | 無(wú)(合并到 attrs方式) |
父?jìng)髯?/td> | provide/inject | provide/inject |
子組件訪問(wèn)父組件 | $parent | 無(wú) |
父組件訪問(wèn)子組件 | $children | 無(wú) |
父組件訪問(wèn)子組件 | $ref | expose&ref |
兄弟組件傳值 | EventBus | mitt |
它們的具體用法可以參考我的這篇文章盤點(diǎn)Vue2和Vue3的10種組件通信方式(值得收藏) - 掘金 (juejin.cn)
除了上面的傳參方式你也可以回答Vuex和Pinia,前提你了解這兩個(gè)狀態(tài)管理器,因?yàn)槟阏f(shuō)了大概率下個(gè)問(wèn)題就會(huì)問(wèn)你Vuex和Pinia
面試問(wèn)到這個(gè)問(wèn)題的時(shí)候,不要上來(lái)就開(kāi)始說(shuō)什么state
,mutation
...。你要先闡述Vuex干嘛用的,什么時(shí)候需要用Vuex。
回答
Vuex是Vue中的全局狀態(tài)管理框架,它可以管理應(yīng)用的所有組件的狀態(tài)。并不是每個(gè)項(xiàng)目都需要引入Vuex的,當(dāng)我們的項(xiàng)目有很多個(gè)頁(yè)面,并且這些頁(yè)面共享著多個(gè)數(shù)據(jù)狀態(tài),此時(shí)我們可以引入Vuex。
Vuex有三個(gè)核心的概念,state
,mutations
,actions
,其中state
為存放數(shù)據(jù)的地方,mutations
中的函數(shù)作用則是用來(lái)修改state
,actions
中一般是用了處理一些異步操作的函數(shù)。
Vuex除了上面三個(gè)概念還有getters
,moudles
,getters
就像Vue中的計(jì)算屬性computed
一樣用來(lái)描述依賴響應(yīng)式狀態(tài)state中的復(fù)雜邏輯。moudles
則是可以將store分割成模塊(module),每個(gè)模塊都擁有自己的state
,mutations
,actions
等,在大型應(yīng)用中經(jīng)常用到
場(chǎng)景:當(dāng)我們異步獲取結(jié)果并賦值給state的時(shí)候,比如數(shù)據(jù)請(qǐng)求,我們可以在actions
中進(jìn)行數(shù)據(jù)請(qǐng)求,拿到結(jié)果通過(guò)它的dispatch
方法調(diào)用mutations
中修改state
的函數(shù),從而將結(jié)果賦值給了state
這個(gè)現(xiàn)在問(wèn)的好像不多,從我最近面試來(lái)看只有我提到了才會(huì)問(wèn)一下,但是以后問(wèn)的肯定會(huì)越來(lái)越多。關(guān)于pinia問(wèn)的一般是它和Vuex的區(qū)別,確切的說(shuō)應(yīng)該是它和Vuex4之間的區(qū)別
回答
pinia
其實(shí)就是Vuex5,它和Vuex的主要區(qū)別有以下幾點(diǎn)
Pinia使用更簡(jiǎn)單,更符合開(kāi)發(fā)者的開(kāi)發(fā)習(xí)慣
pinia
中沒(méi)有了mutations
,狀態(tài)state
的修改可以直接進(jìn)行修改,或者在actions
中修改,或者使用它的$patch
方法進(jìn)行修改
pinia
中沒(méi)有了modules
,如果想使用多個(gè)store,直接使用defineStore
定義多個(gè)store傳入不同的id即可
更好的TS支持,不需要?jiǎng)?chuàng)建自定義的復(fù)雜包裝器來(lái)支持TS
vue 官方提供了v-text、v-for、v-model、v-if 等常用的指令。除此之外vue 還允許開(kāi)發(fā)者自定義指令。面試經(jīng)常會(huì)問(wèn)什么是自定義指令?你用自定義指令做過(guò)哪些功能?
回答1:什么是自定義指令?
自定義指令包含局部指令和全局指令,在模板中使用指令前必須先使用directives
選項(xiàng)注冊(cè)。局部指令指在某個(gè)組件中注冊(cè),而全局則是將指令注冊(cè)到全局,通常在main.js中注冊(cè)。
自定義指令由一個(gè)包含類似組件生命周期鉤子的對(duì)象來(lái)定義。它的生命周期鉤子包含created
,beforeMount
,mounted
,beforeUpdate
,updated
,beforeUnmount
,unmounted
,
常用的鉤子為mounted
和 updated
,它接受el
,binding
等參數(shù).binding
參數(shù)的值一般包含綁定到這個(gè)元素上的信息,比如下面這個(gè)指令
它的binding會(huì)是這個(gè)對(duì)象 回答2:你用自定義指令做過(guò)哪些功能? 數(shù)據(jù)埋點(diǎn),通過(guò)綁定自定義事件傳入點(diǎn)擊當(dāng)前元素需要埋點(diǎn)的事件名,在指令中監(jiān)聽(tīng)當(dāng)前元素的點(diǎn)擊事件后調(diào)用后臺(tái)接口將事件名傳入 權(quán)限控制,通過(guò)綁定自定義事件傳入控制當(dāng)前元素的權(quán)限字段,在指令中獲取到當(dāng)前元素根據(jù)權(quán)限字段來(lái)控制該元素的狀態(tài)(顯示,隱藏等) ... 官網(wǎng)描述 回答 通常我們切換組件的時(shí)候,上一個(gè)組件就會(huì)被銷毀,而當(dāng)我們使用 vue3中已經(jīng)沒(méi)有 vue官網(wǎng)描述: 混入 (mixin) 提供了一種非常靈活的方式,來(lái)分發(fā) Vue 組件中的可復(fù)用功能。一個(gè)混入對(duì)象可以包含任意組件選項(xiàng)。當(dāng)組件使用混入對(duì)象時(shí),所有混入對(duì)象的選項(xiàng)將被“混合”進(jìn)入該組件本身的選項(xiàng)。 回答1. 這道題問(wèn)道的頻率極高,就我經(jīng)歷的多場(chǎng)面試幾乎都會(huì)問(wèn)到,而且是面試到vue方面的開(kāi)門題。 下面是我自己的理解回答,以vue2為例,大家可以借鑒參考 vue的響應(yīng)式原理是根據(jù) 首先會(huì)利用 劫持到每一個(gè)屬性后會(huì)給這個(gè)屬性綁定多個(gè)訂閱者 每個(gè)屬性的多個(gè)訂閱者 當(dāng)data中的某個(gè)屬性發(fā)生改變時(shí)則會(huì)觸發(fā) 一般問(wèn)完響應(yīng)式原理可能會(huì)問(wèn)這兩者的區(qū)別 回答 對(duì)象上新增屬性, 數(shù)組新增修改, vue3新增了兩個(gè)內(nèi)置組件分別是 可以稱之為傳送門,作用將其插槽內(nèi)容渲染到 DOM 中的另一個(gè)位置,接收兩個(gè)參數(shù)to(要去的位置)和disabled(是否留在原位置)。接收比如下面代碼 video將會(huì)被傳送到id為popup的元素下。 它一般用于包裹多個(gè)異步組件處理多個(gè)異步組件加載前與完成后的統(tǒng)一狀態(tài) 關(guān)于nextTick會(huì)問(wèn)到它的用法,然后是它的原理,然后還可能問(wèn)到JS的時(shí)間循環(huán)機(jī)制。 問(wèn)題1:vue中的nextTick是干什么用的? 這個(gè)其實(shí)比較簡(jiǎn)單,用過(guò)都知道它是干嘛的,vue官方的解釋是: 在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個(gè)方法,獲取更新后的 DOM。 這是什么意思呢,其實(shí)vue中修改data不會(huì)立刻觸發(fā)dom更新;而是把需要更新的Watcher加入到queueWatcher隊(duì)列中,然后在合適的時(shí)機(jī)在nextTick中調(diào)用這些Watcher的更新函數(shù)進(jìn)行dom更新,所以在data剛被修改的時(shí)候,我們是獲取不到更新后的dom的,這時(shí)候便需要調(diào)用nextTick函數(shù)在它的回調(diào)函數(shù)中獲取到變化后的dom 問(wèn)題2:nextTick原理 nextTick原理是借助瀏覽器事件循環(huán)來(lái)完成的,因?yàn)槊看问录h(huán)之間都有一次視圖渲染,nextTick盡量在視圖渲染之前完成dom更新,所以nextTick優(yōu)先使用的是promise(微任務(wù))實(shí)現(xiàn) 每次執(zhí)行nextTick時(shí)會(huì)將傳入的回調(diào)函數(shù)放入一個(gè)隊(duì)列中(callbacks數(shù)組),然后當(dāng)在本次事件循環(huán)的同步代碼執(zhí)行完畢后開(kāi)啟一個(gè)微任務(wù)(promise或者M(jìn)utationObserver)去依次執(zhí)行這個(gè)callbacks中的回調(diào)函數(shù)。 但是當(dāng)瀏覽器不支持promise的時(shí)候在vue2中會(huì)進(jìn)行進(jìn)行降級(jí)處理,依次使用 當(dāng)一個(gè)data數(shù)據(jù)更新時(shí)對(duì)應(yīng)的watcher便會(huì)調(diào)用一次nextTick,將它對(duì)應(yīng)的dom更新操作作為回調(diào)函數(shù)放入callbacks中,所以當(dāng)我們想獲取這個(gè)data更新后的dom需要在其值變化后也調(diào)用nextTick將回調(diào)函數(shù)傳入排在上個(gè)更新dom的回調(diào)函數(shù)后面,所以我們可以在這個(gè)nextTick的回調(diào)函數(shù)中獲取到更新后的data 這題在工作中有用嗎是???答案是沒(méi)有用,但是在面試中有用啊,所以我們要會(huì)回答? 問(wèn)題1:什么是虛擬dom? 簡(jiǎn)單來(lái)說(shuō)就是一個(gè)描述dom結(jié)構(gòu)的js對(duì)象 問(wèn)題2:為什么要用虛擬dom? 每當(dāng)我們用原生JS或者JQ操作 而虛擬 問(wèn)題3:說(shuō)一下diff算法 diff算法的本質(zhì)是找出兩個(gè)對(duì)象之間的差異,目的是盡可能復(fù)用節(jié)點(diǎn)。在vue中是當(dāng)狀態(tài)發(fā)生改變,用來(lái)計(jì)算改變后的虛擬DOM與改變前的虛擬DOM之間的差異的算法。 讀到這里,這篇“Vue有哪些高頻面試題”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。 {
arg: 'foo',
modifiers: { bar: true },
value: /* `baz` 的值 */,
oldValue: /* 上一次更新時(shí) `baz` 的值 */
}
keep-alive
是一個(gè)內(nèi)置組件,它的功能是在多個(gè)組件間動(dòng)態(tài)切換時(shí)緩存被移除的組件實(shí)例。
將其包裹的話這個(gè)組件就會(huì)被緩存,當(dāng)這個(gè)組件再一次被顯示時(shí)就會(huì)保留之前的狀態(tài)。keep-alive
接收兩個(gè)屬性include
和 exclude
,分別代表哪些組件要用緩存和哪些不需要緩存,它接收組件的名字?jǐn)?shù)組,字符串或者正則,當(dāng)我們使用動(dòng)態(tài)組件component
或者路由router-view
的時(shí)候可以使用keep-alive
還接收max
屬性表示最大緩存實(shí)例數(shù),如果超出這個(gè)數(shù)則最久沒(méi)有被訪問(wèn)的緩存實(shí)例將被銷毀。keep-alive
有兩個(gè)生命周期,分別是activated
和deactivated
,activated
鉤子會(huì)在首次掛載或者每次從緩存中被重新插入的時(shí)候調(diào)用。deactivated
鉤子則是在組件從DOM上移除或者組件卸載時(shí)調(diào)用vue2混入-Mixin
Mixin
這個(gè)概念了,所以未來(lái)被問(wèn)到的幾率會(huì)越來(lái)越小,但是目前被問(wèn)到的頻率還是很高的。一般會(huì)它的概念以及優(yōu)缺點(diǎn),有時(shí)還會(huì)問(wèn)它與父組件的生命周期執(zhí)行順序Mixin
的作用將組件的公共邏輯提取出來(lái),哪個(gè)組件需要用到時(shí),直接將提取的這部分混入到組件內(nèi)部即可
2. Mixin
的生命周期會(huì)在父組件生命周期之前執(zhí)行,如果Mixin
中的屬性或者方法與父組件沖突則會(huì)使用父組件中的
2. 優(yōu)點(diǎn):可以降低代碼冗余提高邏輯復(fù)用性。
3. 缺點(diǎn):命名容易沖突,不好追溯源,后期排查不方便vue響應(yīng)式原理
Object.defineProperty
這個(gè)api來(lái)對(duì)數(shù)據(jù)進(jìn)行劫持并結(jié)合發(fā)布者-訂閱者模式實(shí)現(xiàn)的Object.defineProperty
中的get
函數(shù)來(lái)對(duì)vue中的data的所有屬性進(jìn)行訪問(wèn)劫持,中間會(huì)涉及到劫持data中更深層次的屬性需要遞歸調(diào)用劫持方法。這里是通過(guò)一個(gè)Observer
類實(shí)現(xiàn)的watcher
,因?yàn)橐粋€(gè)屬性可能被用在很多地方;而這個(gè)watcher
中則包含更新視圖的函數(shù)update
。watcher
和屬性的對(duì)應(yīng)關(guān)系以及和視圖的聯(lián)系則是通過(guò)編譯模板Compile
類來(lái)實(shí)現(xiàn)的。Compile
中會(huì)拿到整個(gè)dom對(duì)象,然后遍歷元素子節(jié)點(diǎn)獲取到使用過(guò)vue中data屬性的則給該屬性直接添加一個(gè)watcher
并賦予一些更新當(dāng)前視圖的方法.watcher
都會(huì)被添加到對(duì)應(yīng)的數(shù)組中,這里則是通過(guò)Deps
類實(shí)現(xiàn)的,初始化watcher
的時(shí)候會(huì)調(diào)用Deps
中的addSub
方法將對(duì)應(yīng)watcher
添加該類的Subs
數(shù)組中Object.defineProperty
中的set
函數(shù),這時(shí)便會(huì)調(diào)用該屬性的Deps
類中的notify
函數(shù)遍歷Subs
數(shù)組中的訂閱者watcher
并調(diào)用其函數(shù)update
去觸發(fā)視圖的更新Object.defineProperty和proxy區(qū)別
Object.defineProperty
只能代理屬性,Proxy
代理的是對(duì)象。Proxy
可以監(jiān)聽(tīng)到,Object.defineProperty
不能。Object.defineProperty
的代理行為是在破壞原對(duì)象的基礎(chǔ)上實(shí)現(xiàn)的,Proxy 則不會(huì)破壞原對(duì)象,只是在原對(duì)象上覆蓋了一層。Proxy
可以監(jiān)聽(tīng)到,Object.defineProperty
不能。Proxy
不兼容IE11
及以下vue3內(nèi)置組件
Teleport
和Suspense
。Teleport
組件Suspense
組件
組件用于協(xié)調(diào)對(duì)組件樹(shù)中嵌套的異步依賴的處理。
組件有兩個(gè)插槽:#default
和 #fallback
,在初始渲染時(shí),
將在內(nèi)存中渲染其默認(rèn)的插槽內(nèi)容。如果在這個(gè)過(guò)程中遇到任何異步依賴,則會(huì)進(jìn)入掛起狀態(tài)等待異步組件加載完畢。在掛起狀態(tài)期間,展示的是 #fallback
插槽內(nèi)容nextTick及原理
setImmediate
、setTimeout
開(kāi)啟一個(gè)宏任務(wù)執(zhí)行callbacksvue虛擬dom,diff算法
DOM
時(shí),瀏覽器會(huì)從頭開(kāi)始進(jìn)行DOM
樹(shù)的構(gòu)建,頻繁的操作DOM
開(kāi)銷是很大的。DOM
就是為了減少這些操作的,虛擬DOM
首先會(huì)通過(guò)狀態(tài)生成一個(gè)虛擬節(jié)點(diǎn)樹(shù)(js對(duì)象),然后使用虛擬節(jié)點(diǎn)樹(shù)進(jìn)行渲染。當(dāng)某些狀態(tài)發(fā)生變更時(shí)會(huì)生成新的虛擬DOM節(jié)點(diǎn)樹(shù),然后與上一次虛擬DOM節(jié)點(diǎn)樹(shù)進(jìn)行比較(diff),從而找到差異的部分,最后渲染到真實(shí)的DOM節(jié)點(diǎn)上面
本文標(biāo)題:Vue有哪些高頻面試題
本文路徑:http://weahome.cn/article/jheogc.html