版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【面試題】2025年vue高頻面試知識點歸總及答案Vue3響應(yīng)式系統(tǒng)核心原理Vue3響應(yīng)式系統(tǒng)基于ES6的Proxy實現(xiàn),相較于Vue2的Object.defineProperty,解決了對象新增屬性、數(shù)組索引修改無法被追蹤的問題。核心實現(xiàn)分為三個部分:1.Track與Trigger機制:通過WeakMap存儲依賴關(guān)系,其中鍵是被代理的目標(biāo)對象,值是另一個Map(鍵為對象的屬性,值為Set類型的effect集合)。當(dāng)訪問響應(yīng)式對象屬性時(track階段),會將當(dāng)前活躍的effect收集到對應(yīng)屬性的依賴集合中;當(dāng)屬性被修改時(trigger階段),會遍歷該屬性的依賴集合并執(zhí)行所有effect,觸發(fā)視圖更新或副作用。2.Reactive與Ref的區(qū)別:reactive用于處理對象(包括數(shù)組、Map等),返回其Proxy代理;ref用于處理基本類型(如number、string)或需要保持響應(yīng)式的對象,內(nèi)部通過包裹一個帶有value屬性的對象實現(xiàn)。需注意,直接訪問ref變量在模板中會自動解包(即無需.value),但在JavaScript中需顯式訪問.value。3.深層響應(yīng)式與淺層響應(yīng)式:默認情況下,reactive創(chuàng)建的是深層響應(yīng)式對象(遞歸代理所有子屬性),而shallowReactive僅代理對象自身屬性;ref默認是深層響應(yīng)式(若值為對象,會自動調(diào)用reactive),shallowRef則僅追蹤.value的修改,不處理內(nèi)部對象的變化。組合式API與選項式API的核心差異組合式API(CompositionAPI)是Vue3推薦的代碼組織方式,與選項式API(OptionsAPI)的本質(zhì)區(qū)別在于邏輯復(fù)用的粒度。選項式API通過data、methods、computed等選項拆分代碼,邏輯分散在不同選項中,導(dǎo)致復(fù)雜組件出現(xiàn)“邏輯關(guān)注點碎片化”(如一個組件的滾動事件處理、數(shù)據(jù)加載、權(quán)限校驗邏輯分散在methods、mounted、watch中)。而組合式API通過setup函數(shù)或<scriptsetup>語法,將同一邏輯相關(guān)的代碼(如狀態(tài)、方法、生命周期鉤子)封裝在一個函數(shù)中(稱為“邏輯組合函數(shù)”),實現(xiàn)更高效的邏輯復(fù)用。例如:```javascript//邏輯組合函數(shù):處理用戶信息加載functionuseUserInfo(userId){constuser=ref(null);consterror=ref(null);constload=async()=>{try{user.value=awaitfetchUser(userId);}catch(err){error.value=err;}};onMounted(load);return{user,error,load};}//組件中使用exportdefault{setup(){const{user,error,load}=useUserInfo(123);return{user,error,load};}};```此外,組合式API對TypeScript的支持更友好,通過顯式的類型聲明可避免選項式API中類型推斷的局限性。組件通信的8種常見方式及適用場景1.Props與$emit:父組件通過props向子組件傳遞數(shù)據(jù),子組件通過$emit觸發(fā)自定義事件向父組件傳遞信息。適用于父子組件的直接通信,需注意props的類型校驗(建議使用type:[String,Number]等聯(lián)合類型)和非Prop特性的繼承(通過inheritAttrs:false控制)。2.v-model雙向綁定:本質(zhì)是props(默認modelValue)與$emit(默認update:modelValue)的語法糖,支持通過model選項自定義屬性名(如model:{prop:'checked',event:'change'})。適用于需要雙向同步的表單組件(如輸入框、開關(guān))。3.Provide/Inject:父組件通過provide提供值,子組件(無論層級多深)通過inject注入值。適用于深層嵌套組件的通信(如主題配置、全局狀態(tài)),需注意默認值的使用(inject('key',()=>'default'))和響應(yīng)式傳遞(若父組件提供的是響應(yīng)式對象,子組件注入后可自動響應(yīng)變化)。4.Pinia狀態(tài)管理:通過定義store(如userStore),在組件中通過storeToRefs解構(gòu)響應(yīng)式狀態(tài),或直接調(diào)用store的方法。適用于跨組件/跨頁面的全局狀態(tài)共享,相較于Vuex,Pinia移除了mutations,支持組合式API風(fēng)格的store定義,且天然支持TypeScript。5.事件總線(Mitt):通過第三方庫(如mitt)創(chuàng)建全局事件中心,組件間通過on/off/emit方法通信。適用于非父子、非嵌套的組件通信,但需注意事件命名沖突和內(nèi)存泄漏(及時移除監(jiān)聽)。6.全局變量(Vtotype):在Vue實例原型上掛載全局對象(如app.config.globalProperties.$http),組件中通過this.$http訪問。適用于工具函數(shù)或全局服務(wù)的注入,但需避免濫用(可能導(dǎo)致組件耦合)。7.插槽作用域(ScopedSlots):父組件通過具名插槽傳遞數(shù)據(jù),子組件通過slot-scope接收。適用于需要子組件向父組件傳遞部分數(shù)據(jù)的場景(如列表項的自定義渲染)。8.$parent/$children:直接訪問父/子組件實例,適用于緊急情況下的臨時通信,但強依賴組件層級結(jié)構(gòu),維護性差,不推薦常規(guī)使用。Vue3生命周期鉤子的變化與執(zhí)行順序Vue3對生命周期鉤子進行了重命名以匹配組合式API,同時保留了選項式API的寫法。具體對應(yīng)關(guān)系如下:-beforeCreate→setup(開始前)-created→setup(結(jié)束后)-beforeMount→onBeforeMount-mounted→onMounted-beforeUpdate→onBeforeUpdate-updated→onUpdated-beforeUnmount→onBeforeUnmount-unmounted→onUnmounted-errorCaptured→onErrorCaptured執(zhí)行順序方面,父子組件的生命周期遵循“父beforeMount→子beforeMount→子mounted→父mounted”的順序;更新時,父beforeUpdate→子beforeUpdate→子updated→父updated;卸載時,父beforeUnmount→子beforeUnmount→子unmounted→父unmounted。需注意,setup函數(shù)在beforeCreate之前執(zhí)行,且由于響應(yīng)式系統(tǒng)的初始化,setup中無法訪問this(指向undefined)。虛擬DOM與Diff算法的優(yōu)化點(Vue3vsVue2)Vue3的虛擬DOM(VNode)在Vue2基礎(chǔ)上進行了多項優(yōu)化:1.PatchFlag(補丁標(biāo)記):為VNode添加標(biāo)記(如TEXT=1、CLASS=2、STYLE=4等),標(biāo)記該節(jié)點需要比對的屬性類型。在Diff過程中,僅對有標(biāo)記的屬性進行比對,無標(biāo)記的節(jié)點(如純靜態(tài)節(jié)點)直接跳過,大幅減少計算量。例如:```html<!--文本節(jié)點會被標(biāo)記為TEXT--><div>{{msg}}</div><!--靜態(tài)節(jié)點無標(biāo)記,直接緩存--><div>靜態(tài)內(nèi)容</div>```2.Block樹結(jié)構(gòu):將模板中的動態(tài)節(jié)點(帶PatchFlag)及其父節(jié)點組織成Block樹,避免遞歸遍歷所有子節(jié)點。例如,一個包含多個動態(tài)子節(jié)點的容器會被標(biāo)記為BLOCK,其內(nèi)部動態(tài)子節(jié)點的PatchFlag會被收集,Diff時僅需處理這些動態(tài)節(jié)點。3.靜態(tài)提升(StaticHoisting):將模板中的靜態(tài)節(jié)點(如不變的文本、HTML結(jié)構(gòu))提升到渲染函數(shù)外,避免每次渲染時重復(fù)創(chuàng)建。例如:```javascript//優(yōu)化前(每次渲染創(chuàng)建靜態(tài)節(jié)點)render(){returnh('div',{class:'container'},'靜態(tài)內(nèi)容');}//優(yōu)化后(靜態(tài)節(jié)點僅創(chuàng)建一次)const_hoisted_1=h('div',{class:'container'},'靜態(tài)內(nèi)容');render(){return_hoisted_1;}```4.事件緩存(EventCaching):對動態(tài)綁定的事件處理函數(shù)(如@click="handleClick")進行緩存,避免因函數(shù)引用變化導(dǎo)致的不必要更新。Pinia的核心設(shè)計與優(yōu)勢Pinia是Vue3推薦的狀態(tài)管理庫,相較于Vuex(4.x),其核心優(yōu)勢體現(xiàn)在:1.無Mutations設(shè)計:移除了強制的mutations,僅保留state、getters、actions,其中actions可以是同步或異步的(Vuex中actions處理異步,mutations處理同步)。簡化了狀態(tài)修改流程,開發(fā)者可直接在actions中修改state(內(nèi)部通過代理實現(xiàn)響應(yīng)式追蹤)。2.組合式API風(fēng)格的Store:支持通過defineStore定義組合式Store(使用setup函數(shù)),允許在Store中使用ref、reactive、computed等響應(yīng)式API,以及生命周期鉤子(如onMounted)。例如:```javascript//組合式Store示例constuseUserStore=defineStore('user',()=>{constname=ref('');constfetchName=async()=>{name.value=awaitapi.getUser();};return{name,fetchName};});```3.類型安全:Pinia的API(如defineStore、storeToRefs)天然支持TypeScript類型推斷,無需額外配置即可獲得完善的類型提示。4.模塊化與樹搖優(yōu)化:Store以模塊化方式定義(每個Store有唯一id),未使用的Store不會被打包,結(jié)合ES模塊的樹搖功能,減少最終包體積。5.更輕量的體積:Pinia核心代碼僅約1KB(gzip后),遠小于Vuex的體積。SFC(單文件組件)的編譯過程與<scriptsetup>的優(yōu)勢Vue3的SFC通過@vue/compiler-sfc編譯為JavaScript渲染函數(shù),主要流程包括:1.解析(Parse):將.vue文件拆分為template、script、style三部分,提取各部分內(nèi)容。2.轉(zhuǎn)換(Transform):對template進行編譯,提供帶PatchFlag的VNode樹;對script進行處理(如處理<scriptsetup>語法糖);對style進行作用域處理(如添加data-v-xxx屬性)。3.提供(Generate):將轉(zhuǎn)換后的內(nèi)容組合為最終的JavaScript模塊,導(dǎo)出組件選項對象。<scriptsetup>是Vue3新增的語法糖,相較于普通<script>的優(yōu)勢:1.自動暴露變量:在<scriptsetup>中聲明的變量、函數(shù)會自動暴露給模板,無需顯式return。例如:```vue<scriptsetup>constmsg='Hello';consthandleClick=()=>{};</script><template><div@click="handleClick">{{msg}}</div></template>```2.更簡潔的組件引入:引入子組件后無需在components選項中注冊,直接在模板中使用。例如:```vue<scriptsetup>importChildfrom'./Child.vue';</script><template><Child/></template>```3.支持頂層await:可以在<scriptsetup>中使用await,編譯器會自動將組件包裝為異步組件。例如:```vue<scriptsetup>constdata=awaitfetchData();</script>```4.更高效的TypeScript支持:通過defineProps、defineEmits等宏函數(shù)(無需導(dǎo)入)聲明props和事件,類型信息會自動暴露給IDE,無需手動編寫JSDoc注釋。性能優(yōu)化的10個實踐技巧1.使用v-memo緩存動態(tài)列表:對于大數(shù)據(jù)量的列表(如1000+項),使用v-memo="[item.id]"緩存每個列表項的VNode,避免重復(fù)渲染未變化的項。2.合理選擇v-if與v-show:頻繁切換的元素用v-show(僅切換display屬性),較少切換或初始條件不滿足的用v-if(直接銷毀/重建DOM)。3.組件緩存(keep-alive):對需要保留狀態(tài)的組件(如標(biāo)簽頁),使用<keep-alive:include="['TabA']">包裹,配合activated/desactivated生命周期鉤子處理緩存時的邏輯。4.異步組件與懶加載:通過defineAsyncComponent動態(tài)加載大組件(如第三方圖表庫),減少首屏加載時間。例如:```javascriptconstHeavyComponent=defineAsyncComponent(()=>import('./HeavyComponent.vue'));```5.優(yōu)化Watch的深度監(jiān)聽:默認watch是淺層監(jiān)聽,對對象屬性的修改需設(shè)置deep:true,但會增加性能開銷。建議直接監(jiān)聽具體屬性(如watch(()=>,...))或使用computed轉(zhuǎn)換需要監(jiān)聽的值。6.減少響應(yīng)式對象的大小:避免將大對象(如API返回的原始數(shù)據(jù))直接轉(zhuǎn)為響應(yīng)式,可提取需要響應(yīng)的部分(如僅name、age)或使用shallowReactive。7.使用CSS動畫替代JS動畫:復(fù)雜的動畫效果(如過渡、滾動)通過CSS的transform、opacity屬性實現(xiàn),利用GPU加速,減少JS執(zhí)行時間。8.服務(wù)端渲染(SSR)或靜態(tài)站點提供(SSG):對于內(nèi)容型網(wǎng)站(如博客),使用Nuxt.js等框架進行SSR/SSG,提升首屏加載速度和SEO。9.優(yōu)化VNode的key值:避免使用索引(index)作為key,優(yōu)先使用唯一標(biāo)識(如id),確保Diff算法正確識別節(jié)點變化,減少不必要的DOM操作。10.利用Vite的優(yōu)化功能:開發(fā)時使用Vite的HMR(熱模塊替換)提升效率,生產(chǎn)構(gòu)建時通過vite-plugin-purge-icons等插件移除未使用的圖標(biāo),通過splitChunk配置優(yōu)化包體積。自定義指令的實現(xiàn)與注意事項自定義指令用于對DOM元素進行底層操作(如聚焦、拖拽、權(quán)限控制),Vue3中通過directive選項或app.directive全局注冊。核心鉤子函數(shù)包括:-beforeMount:元素掛載前-mounted:元素掛載后-beforeUpdate:元素更新前-updated:元素更新后-beforeUnmount:元素卸載前-unmounted:元素卸載后示例(自動聚焦指令):```javascript//全局注冊app.directive('focus',{mounted(el){el.focus();}});//組件中使用<template><inputv-focus/></template>```注意事項:1.DOM操作時機:對DOM的修改應(yīng)在mounted或updated鉤子中進行(beforeMount時元素未插入DOM)。2.響應(yīng)式參數(shù):若指令接收動態(tài)參數(shù)(如v-highlight="color"),需在updated鉤子中重新應(yīng)用邏輯,確保參數(shù)變化時DOM更新。3.內(nèi)存泄漏:在指令中添加的事件監(jiān)聽(如拖拽的mousemove)需在beforeUnmount鉤子中移除,避免組件卸載后仍占用內(nèi)存。TypeScript與Vue3的深度集成Vue3官方推薦使用TypeScript,核心集成點包括:1.defineComponent的類型推斷:通過defineComponent聲明組件,編譯器會自動推導(dǎo)props、emits的類型。例如:```vue<scriptlang="ts">import{defineComponent}from'vue';exportdefaultdefineComponent({props:{msg:{type:String,required:true}},emits:['change'],setup(props,{emit}){//props.msg類型為string(自動推斷)emit('change',123);//類型檢查:參數(shù)需為number(若emits定義為['change'],則參數(shù)類型為any;推薦顯式聲明類型)}});</script>```2.PropType的使用:對于復(fù)雜類型的props(如對象、數(shù)組),使用PropType明確類型。例如:```typescriptimport{PropType}from'vue';props:{user:{type:ObjectasPropType<{na
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 獸醫(yī)胸腔超聲培訓(xùn)課件
- 2026年及未來5年市場數(shù)據(jù)中國大型購物中心行業(yè)市場發(fā)展數(shù)據(jù)監(jiān)測及投資方向研究報告
- 養(yǎng)老院投訴處理與改進制度
- 企業(yè)內(nèi)部資料管理制度
- 養(yǎng)雞肉雞技術(shù)培訓(xùn)課件
- 2026福建三明市公安局三元分局招聘警務(wù)輔助人員24人參考題庫附答案
- 2026福建泉州市面向國防科技大學(xué)選優(yōu)生選拔引進考試備考題庫附答案
- 2026遼寧朝陽市教育局直屬學(xué)校赴高校招聘教師(第二批次)102人備考題庫附答案
- 保密及知識產(chǎn)權(quán)保護制度
- 2026陜西省面向北京科技大學(xué)招錄選調(diào)生備考題庫附答案
- 單位內(nèi)部化妝培訓(xùn)大綱
- 高校行政管理流程及案例分析
- 高效節(jié)水灌溉方式課件
- 基坑安全工程題庫及答案解析
- 《人間充質(zhì)基質(zhì)細胞來源細胞外囊泡凍干粉質(zhì)量要求》(征求意見稿)
- 中潤盛和(孝義)新能源科技 孝義市杜村鄉(xiāng)分散式微風(fēng)發(fā)電項目可行性研究報告
- 鄉(xiāng)鎮(zhèn)村監(jiān)會培訓(xùn)課件
- 入團申請書教學(xué)課件
- 松下微波爐NN-DS581M使用說明書
- 2026年中國農(nóng)業(yè)銀行秋季校園招聘即將開始考試筆試試題(含答案)
- 2025年江蘇省招聘警務(wù)輔助人員考試真題及答案
評論
0/150
提交評論