版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2025年vuejs部分面試題及答案Vue3中reactive和ref的核心區(qū)別主要體現(xiàn)在實(shí)現(xiàn)方式、適用數(shù)據(jù)類型和解包行為上。reactive基于ES6的Proxy實(shí)現(xiàn),用于為對(duì)象(包括數(shù)組、Map等)創(chuàng)建深層響應(yīng)式代理,其內(nèi)部會(huì)遞歸攔截所有屬性的訪問和修改操作。而ref則通過RefImpl類實(shí)現(xiàn),主要用于包裝基本數(shù)據(jù)類型(如string、number、boolean)或?qū)ο螅浜诵氖峭ㄟ^.value屬性來觸發(fā)依賴收集和更新。當(dāng)ref被用于模板或在響應(yīng)式對(duì)象中作為屬性訪問時(shí),會(huì)自動(dòng)解包(即無需顯式訪問.value),但在普通JavaScript代碼中仍需通過.value操作。實(shí)際開發(fā)中,處理對(duì)象或數(shù)組時(shí)優(yōu)先使用reactive;基本數(shù)據(jù)類型或需要模板直接綁定(如v-model)時(shí)更適合ref。若需在composables中返回對(duì)象,使用ref可避免解構(gòu)導(dǎo)致的響應(yīng)式丟失(reactive對(duì)象解構(gòu)后會(huì)失去響應(yīng)性,而ref解構(gòu)時(shí)保留.value訪問)。組合式API相比選項(xiàng)式API的優(yōu)勢體現(xiàn)在邏輯復(fù)用、代碼組織和類型支持三方面。選項(xiàng)式API按功能劃分選項(xiàng)(data、methods、computed),導(dǎo)致復(fù)雜邏輯分散在不同選項(xiàng)中,復(fù)用需依賴mixins(易引發(fā)命名沖突和作用域不明確)。組合式API通過setup函數(shù)和生命周期鉤子(如onMounted)將關(guān)聯(lián)邏輯集中在自定義composables中,邏輯復(fù)用更靈活(直接導(dǎo)入函數(shù)),且代碼結(jié)構(gòu)更清晰(按功能模塊組織)。大型項(xiàng)目中,組合式API的優(yōu)勢更顯著:可維護(hù)性更高(邏輯內(nèi)聚)、類型推導(dǎo)更友好(TS可準(zhǔn)確推斷函數(shù)返回值類型)、跨組件邏輯共享更便捷(避免mixins的副作用)。Vue3響應(yīng)式系統(tǒng)基于Proxy和Reflect實(shí)現(xiàn)。對(duì)于對(duì)象,通過newProxy(target,handler)攔截所有屬性的get、set、deleteProperty等操作;對(duì)于基本類型,通過Ref包裝為對(duì)象,利用get/set攔截.value的訪問。相比Vue2的Object.defineProperty,Proxy的優(yōu)勢在于:1.可攔截更多操作(如in、for...of、對(duì)象屬性的添加/刪除),無需遞歸遍歷對(duì)象提前定義getter/setter;2.支持?jǐn)?shù)組的原生方法(如push、splice)自動(dòng)觸發(fā)更新(Vue2需重寫數(shù)組方法);3.對(duì)深層對(duì)象的響應(yīng)式處理更高效(僅在訪問時(shí)遞歸代理,而非初始化時(shí)全量遍歷)。組合式API中使用生命周期鉤子需導(dǎo)入對(duì)應(yīng)的函數(shù)(如onMounted、onUpdated),并在setup函數(shù)或composables中調(diào)用。setup函數(shù)在組件實(shí)例創(chuàng)建后、beforeCreate之前執(zhí)行,此時(shí)組件實(shí)例尚未提供(無法通過this訪問),且props已解析完成。注意事項(xiàng):1.setup返回的對(duì)象會(huì)暴露給模板(可直接使用返回的變量/方法);2.若返回函數(shù),則作為渲染函數(shù)(覆蓋template);3.異步操作需在setup內(nèi)部通過async/await處理(但需配合Suspense組件);4.避免在setup中使用this(會(huì)指向undefined)。組件通信方式包括:props/emit(父子)、事件總線(已不推薦,可用mitt替代)、provide/inject(跨層級(jí))、Pinia/Vuex(全局狀態(tài))、自定義事件(通過$root或全局事件池)。provide/inject適用于深層嵌套組件傳遞數(shù)據(jù),無需逐層傳遞props。在組合式API中,使用provide(key,value)提供數(shù)據(jù)(key可為字符串/符號(hào)),inject(key,defaultValue?,options?)注入數(shù)據(jù)(options可設(shè)置shallow控制是否深層響應(yīng))。示例:父組件provide('theme',reactive({color:'dark'})),子組件通過consttheme=inject('theme')獲取,修改theme.color會(huì)觸發(fā)所有注入該值的組件更新。Pinia相比Vuex的改進(jìn)體現(xiàn)在:1.無mutations(僅state、getters、actions),代碼更簡潔;2.支持TypeScript(通過defineStore的泛型和自動(dòng)類型推導(dǎo));3.模塊化設(shè)計(jì)(store按文件拆分,無需手動(dòng)注冊(cè));4.體積更小(無復(fù)雜的module和namespace機(jī)制);5.actions支持同步/異步(無需區(qū)分)。定義Piniastore示例:```typescriptimport{defineStore}from'pinia'exportconstuseUserStore=defineStore('user',{state:()=>({name:'Guest',age:0}),getters:{fullName:(state)=>`Mr.${}`},actions:{asyncfetchUser(id:number){constres=awaitfetch(`/api/user/${id}`)this.$patch(awaitres.json())//批量更新state}}})```狀態(tài)持久化可通過pinia-plugin-persistedstate插件實(shí)現(xiàn),在store中配置persist:{storage:localStorage}即可自動(dòng)同步state到本地存儲(chǔ)。v-for中key的作用是標(biāo)識(shí)節(jié)點(diǎn)的唯一性,幫助Vue的diff算法快速識(shí)別哪些節(jié)點(diǎn)需要更新、添加或刪除。若使用index作為key,當(dāng)列表順序變化或中間插入/刪除元素時(shí),會(huì)導(dǎo)致key與實(shí)際數(shù)據(jù)不匹配,引發(fā)錯(cuò)誤的DOM復(fù)用(如輸入框內(nèi)容錯(cuò)亂)。動(dòng)態(tài)增刪場景應(yīng)選擇數(shù)據(jù)中唯一且穩(wěn)定的標(biāo)識(shí)(如數(shù)據(jù)庫ID、UUID)作為key,確保key與數(shù)據(jù)一一對(duì)應(yīng)。例如:```vue<template><divv-for="iteminlist":key="item.id">{{}}</div></template>```優(yōu)化首屏加載速度的策略:1.路由懶加載(使用import()動(dòng)態(tài)導(dǎo)入組件,Webpack/Vite自動(dòng)拆分為chunk);2.組件按需加載(通過defineAsyncComponent包裝非首屏組件);3.壓縮資源(生產(chǎn)環(huán)境開啟Gzip/Brotli壓縮,配置Vite的build.terserOptions);4.圖片優(yōu)化(使用WebP格式、響應(yīng)式圖片srcset、懶加載v-lazy);5.減少包體積(移除冗余依賴、使用TreeShaking、替換大庫為輕量替代方案如lodash-es);6.服務(wù)端渲染(SSR/SSG,如使用Nuxt3提供靜態(tài)HTML);7.預(yù)加載關(guān)鍵資源(通過<linkrel="preload">優(yōu)先加載首屏JS/CSS)。Vue3集成TypeScript的方法:1.使用defineComponent聲明組件(自動(dòng)推導(dǎo)props、emits類型);2.props類型定義:通過withDefaults設(shè)置默認(rèn)值并推導(dǎo)類型;```typescriptdefineComponent({props:{msg:{type:String,required:true},count:{type:Number,default:0}}asconst//或使用withDefaults})//更推薦withDefaultsconstprops=withDefaults(defineProps<{msg:stringcount?:number}>,{count:0})```3.自定義hooks類型約束:返回值使用泛型或明確類型;```typescriptfunctionuseFetch<T>(url:string){constdata=ref<T|null>(null)//...return{data}as{data:Ref<T|null>}}```4.組件實(shí)例類型:通過InstanceType獲取組件類型(如typeMyComponent=InstanceType<typeofMyComponent>)。VueRouter導(dǎo)航守衛(wèi)包括全局守衛(wèi)(beforeEach、afterEach)、路由獨(dú)享守衛(wèi)(beforeEnter)、組件內(nèi)守衛(wèi)(beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave)。組合式API中使用導(dǎo)航守衛(wèi)需導(dǎo)入useRouter并在setup中調(diào)用:```typescriptconstrouter=useRouter()router.beforeEach((to,from)=>{if(to.meta.requiresAuth&&!isAuthenticated.value){return{path:'/login'}}})```動(dòng)態(tài)路由(如/user/:id)的加載時(shí)機(jī)是在組件渲染時(shí),通過$route.params獲取參數(shù)。注意:當(dāng)參數(shù)變化(如從/user/1到/user/2)時(shí),組件默認(rèn)不會(huì)重新渲染,需通過watch($route)或beforeRouteUpdate守衛(wèi)處理。自定義指令的生命周期鉤子有:beforeMount(元素掛載前)、mounted(元素掛載后)、beforeUpdate(元素更新前)、updated(元素更新后)、beforeUnmount(元素卸載前)、unmounted(元素卸載后)。實(shí)現(xiàn)防抖指令v-debounce示例:```typescriptconstdebounceDirective:Directive={beforeMount(el,binding){lettimer:NodeJS.Timeoutconstdelay=binding.arg||500//動(dòng)態(tài)延遲時(shí)間(通過v-debounce:1000指定)consteventType=binding.modifiers.click?'click':'input'//支持修飾符指定事件類型el.addEventListener(eventType,(e)=>{clearTimeout(timer)timer=setTimeout(()=>{binding.value(e)//執(zhí)行綁定的函數(shù)},delay)})}}//使用:<inputv-debounce:1000.click="handleInput"/>```Suspense組件用于處理異步依賴的加載狀態(tài),可包裹一個(gè)或多個(gè)異步組件,在加載完成前顯示fallback內(nèi)容。它與異步組件、asyncsetup的關(guān)系:1.異步組件(通過defineAsyncComponent定義)加載時(shí),Suspense會(huì)捕獲其pending狀態(tài);2.setup函數(shù)支持async(返回Promise),Suspense會(huì)等待該P(yáng)romiseresolve后再渲染組件;3.Suspense的fallback在子組件加載/重新加載時(shí)顯示,適用于數(shù)據(jù)獲取、動(dòng)態(tài)組件加載等場景。示例:```vue<template><Suspense><templatedefault><AsyncComponent/><!--內(nèi)部使用asyncsetup或異步組件--></template><templatefallback><LoadingSpinner/></template></Suspense></template>```分析Vue應(yīng)用性能瓶頸的步驟:1.打開ChromeDevTools,切換到Performance面板;2.刷新頁面并開始錄制(Record),完成首屏加載后停止錄制;3.查看Summary標(biāo)簽,分析總加載時(shí)間、腳本執(zhí)行時(shí)間、渲染時(shí)間占比;4.在Bottom-Up標(biāo)簽中按耗時(shí)排序,定位耗時(shí)較長的函數(shù)(如大量計(jì)算的watch、復(fù)雜的computed);5.使用VueDevTools的Performance標(biāo)簽,查看組件渲染時(shí)間、更新次數(shù)(識(shí)別頻繁重新渲染的組件);6.檢查網(wǎng)絡(luò)請(qǐng)求(Network面板),分析大文件加載時(shí)間(如未壓縮的JS/CSS、大圖片);7.結(jié)合Lighthouse工具提供性能報(bào)告,獲取優(yōu)化建議(如未使用的CSS/JS、未優(yōu)化的圖片)。v-if和v-show的區(qū)別:v-if是條件渲染,通過銷毀/重建DOM元素實(shí)現(xiàn),適用于條件不常變化的場景;v-show是條件顯示,通過CSS的display屬性控制(元素始終存在DOM中),適用于頻繁切換的場景。優(yōu)先使用v-show的場景:選項(xiàng)卡切換、折疊面板等需要頻繁顯示/隱藏的組件(減少DOM操作開銷)。實(shí)現(xiàn)可復(fù)用全局組件庫的設(shè)計(jì)要點(diǎn):1.樣式隔離:使用CSSModules、ScopedCSS或CSS-in-JS(如styled-components)避免樣式?jīng)_突;2.props校驗(yàn):通過defineProps嚴(yán)格定義props類型(支持TS),提供默認(rèn)值和文檔說明;3.事件處理:使用defineEmits聲明自定義事件,確保父組件可監(jiān)聽并響應(yīng);4.可訪問性(a11y):添加aria屬性、鍵盤導(dǎo)航支持;5.按需加載:通過TreeShaking配置,允許用戶僅導(dǎo)入需要的組件;6.主題定制:提供CSS變量或scss變量,支持自定義主題;7.文檔完善:使用Storybook或VitePress提供組件文檔,包含示例、API、使用場景說明。Teleport組件用于將子組件渲染到DOM樹的其他位置(如body下),解決模態(tài)框、提示框等組件因父級(jí)樣式(如overflow:hidden)導(dǎo)致的渲染問題。示例:```vue<template><divclass="parent"style="overflow:hidden"><Teleportto="body"><Modal/><!--渲染到body下,避免被parent的overflow截?cái)?-></Teleport></div></template>```computed和watch的區(qū)別:computed用于基于現(xiàn)有狀態(tài)計(jì)算新值(有緩存,依賴不變時(shí)直接返回緩存),適用于需要?jiǎng)討B(tài)計(jì)算的場景;watch用于監(jiān)聽狀態(tài)變化并執(zhí)行副作用(如發(fā)起請(qǐng)求、修改DOM),適用于需要響應(yīng)數(shù)據(jù)變化執(zhí)行操作的場景。組合式API中創(chuàng)建帶副作用的watch示例:```typescriptconstsearchQuery=ref('')watch(searchQuery,async(newVal,oldVal)=>{if(newVal){constresults=awaitfetch(`/api/search?q=${newVal}`)//更新結(jié)果列表}},{immediate:true,deep:true})//immediate:立即執(zhí)行,deep:監(jiān)聽對(duì)象深層變化```處理內(nèi)存泄漏的常見場景及方案:1.未清除的定時(shí)器:在beforeUnmount鉤子中調(diào)用clearTimeout/clearInterval;2.未移除的事件監(jiān)聽:使用addEventListener添加的監(jiān)聽需在unmounted中removeEventListener;3.未取消的異步請(qǐng)求:使用AbortController取消未完成的fetch請(qǐng)求;4.未停止的watch:watch返回的停止函數(shù)需在組件卸載時(shí)調(diào)用(如conststop=watch(...);onUnmounted(stop));5.全局事件/狀態(tài)訂閱:如訂閱Piniastore的$onAction,需在組件卸載時(shí)取消訂閱。Vite相比Web
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年北京協(xié)和醫(yī)院內(nèi)分泌科于淼課題組合同制科研助理招聘備考題庫參考答案詳解
- 土地及房屋買賣合同
- 2026年醫(yī)療法律顧問協(xié)議
- 2026年生活共享文化合同
- 2025年眉山市青神縣人民法院公開招聘勞務(wù)派遣司法警察的備考題庫完整答案詳解
- 2026年藥品分銷合同
- 2026年快餐加盟合同
- 2025年昭覺縣應(yīng)急管理局關(guān)于公開招聘綜合應(yīng)急救援隊(duì)伍人員的備考題庫及1套參考答案詳解
- 2025年北京林業(yè)大學(xué)自聘勞動(dòng)合同制人員招聘備考題庫參考答案詳解
- 2025年株洲市炎陵縣財(cái)政局、縣審計(jì)局公開招聘專業(yè)人才備考題庫及完整答案詳解一套
- 博士課程-中國馬克思主義與當(dāng)代(2024年修)習(xí)題答案
- T/CAPE 11005-2023光伏電站光伏組件清洗技術(shù)規(guī)范
- 水電詞匯手冊(cè)漢英版+英漢版
- 應(yīng)用化工技術(shù)職業(yè)生涯規(guī)劃書
- 水表過戶申請(qǐng)書范本
- 宏天BPMX3.3業(yè)務(wù)流程管理平臺(tái)操作手冊(cè)
- 桶裝水配送承包運(yùn)輸協(xié)議書范本(2024版)
- 質(zhì)疑函授權(quán)委托書
- 低空經(jīng)濟(jì)產(chǎn)業(yè)園建設(shè)項(xiàng)目可行性研究報(bào)告
- 中考數(shù)學(xué)講座中考數(shù)學(xué)解答技巧基礎(chǔ)復(fù)習(xí)課件
- APQP流程管理-各階段輸出資料一覽表
評(píng)論
0/150
提交評(píng)論