2025年vue前端面試題目及最佳答案_第1頁
2025年vue前端面試題目及最佳答案_第2頁
2025年vue前端面試題目及最佳答案_第3頁
2025年vue前端面試題目及最佳答案_第4頁
2025年vue前端面試題目及最佳答案_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

2025年vue前端面試題目及最佳答案Vue3響應(yīng)式系統(tǒng)中,Ref和Reactive的核心差異是什么?實際開發(fā)中如何選擇?Ref通過`RefImpl`類包裝原始值(如字符串、數(shù)字)或?qū)ο?,其值存儲在`_value`屬性中,訪問時需通過`.value`,本質(zhì)是對原始值的代理。Reactive基于`Proxy`對對象進行深度代理,直接訪問屬性即可觸發(fā)響應(yīng)式。關(guān)鍵差異在于:Ref可處理原始值和對象,Reactive僅處理對象(且無法直接代理原始值);Ref的`.value`訪問機制使其在模板中可自動解包(如`{{count}}`等價于`{{count.value}}`),而Reactive的嵌套對象需確保所有層級屬性都被代理(避免直接替換對象導(dǎo)致響應(yīng)式丟失)。選擇時,若狀態(tài)是原始值(如`count:0`)或需要在模板中直接使用(如輸入框綁定`v-model`),優(yōu)先用Ref;若狀態(tài)是復(fù)雜對象(如`user:{name:'張三',age:25}`)且需深度響應(yīng),用Reactive。需注意,Reactive包裝的對象被解構(gòu)后會丟失響應(yīng)性(因解構(gòu)得到的是原始值),此時應(yīng)改用Ref或使用`toRefs`轉(zhuǎn)換。例如:```javascript//錯誤示例:解構(gòu)后丟失響應(yīng)性conststate=reactive({name:'張三'});const{name}=state;//name是原始值,修改不觸發(fā)更新//正確方式:用toRefs保持響應(yīng)性conststate=reactive({name:'張三'});const{name}=toRefs(state);//name是Ref對象,修改name.value觸發(fā)更新```組合式API中,自定義Composable函數(shù)的設(shè)計原則和常見陷阱有哪些?設(shè)計原則:1.單一職責(zé):每個Composable專注解決一個具體問題(如`useFetch`處理數(shù)據(jù)請求,`useLocalStorage`管理本地存儲),避免功能冗余。2.狀態(tài)隔離:內(nèi)部通過`ref`或`reactive`創(chuàng)建的狀態(tài)應(yīng)在函數(shù)內(nèi)部管理,避免外部污染;若需暴露狀態(tài),返回響應(yīng)式引用(如`return{data,error}`)。3.生命周期兼容:在Composable中使用生命周期鉤子(如`onMounted`)時,需確保調(diào)用發(fā)生在組件設(shè)置階段(即`setup`或Composable被組件調(diào)用時),否則會報錯。4.類型友好:使用TypeScript時,為輸入?yún)?shù)和返回值添加類型定義,提升可維護性(如`interfaceUseFetchOptions{url:string}`)。常見陷阱:-意外的閉包捕獲:若Composable依賴外部響應(yīng)式變量(如父組件的`props`),需確保在函數(shù)內(nèi)部正確追蹤其變化。例如:```javascript//錯誤:閉包捕獲導(dǎo)致無法響應(yīng)props變化functionuseMyComposable(props){constinternalValue=ref(props.initialValue);//僅在首次調(diào)用時獲取props.initialValuewatch(()=>props.initialValue,(newVal)=>{//需顯式watch追蹤變化internalValue.value=newVal;});}```-重復(fù)的副作用:若在Composable中使用`watch`或`onMounted`,需注意組件多次實例化時可能導(dǎo)致副作用重復(fù)執(zhí)行(如定時器未清除)。應(yīng)在`onUnmounted`中清理:```javascriptfunctionuseTimer(){consttime=ref(0);lettimer;onMounted(()=>{timer=setInterval(()=>time.value++,1000);});onUnmounted(()=>{clearInterval(timer);//避免內(nèi)存泄漏});return{time};}```Pinia相比Vuex的核心優(yōu)勢有哪些?如何設(shè)計可擴展的PiniaStore?核心優(yōu)勢:1.更簡潔的API:Pinia移除了Vuex的`mutations`(僅保留`state`、`getters`、`actions`),通過直接調(diào)用`actions`修改狀態(tài),代碼量減少約40%。2.模塊化設(shè)計:Pinia的Store通過`defineStore`定義,天然支持Tree-shaking(未使用的Store不會被打包),而Vuex需手動配置`modules`且可能產(chǎn)生冗余代碼。3.類型安全:Pinia原生支持TypeScript,通過泛型推導(dǎo)自動推斷狀態(tài)和方法的類型(如`defineStore<StateType>(...)`),減少類型斷言的使用。4.組合式API友好:Pinia的Store可在`setup`中通過`useStore()`獲取,與組合式API無縫集成(如在Composable中調(diào)用Store方法)。設(shè)計可擴展Store的實踐:-狀態(tài)拆分:按功能模塊劃分Store(如`userStore`管理用戶信息,`cartStore`管理購物車),避免單個Store過于龐大。-狀態(tài)持久化:通過`pinia-plugin-persistedstate`插件,配置`persist:true`自動將Store狀態(tài)同步到`localStorage`或`sessionStorage`,需注意敏感數(shù)據(jù)(如token)應(yīng)加密存儲。-異步操作封裝:在`actions`中使用`async/await`處理異步請求,返回Promise以便組件中鏈?zhǔn)秸{(diào)用。例如:```typescript//userStore.tsimport{defineStore}from'pinia';importapifrom'@/api';exportconstuseUserStore=defineStore('user',{state:()=>({userInfo:nullasUserInfo|null,isLoading:false}),getters:{userName:(state)=>state.userInfo?.name||'未登錄'},actions:{asyncfetchUserInfo(userId:string){this.isLoading=true;try{constres=awaitapi.getUserInfo(userId);this.userInfo=res.data;returnres.data;//允許組件調(diào)用時繼續(xù)處理數(shù)據(jù)}finally{this.isLoading=false;}}},persist:{paths:['userInfo'],//僅持久化userInfo字段storage:sessionStorage//使用sessionStorage}});```Vue3中如何優(yōu)化大型列表的渲染性能?`v-memo`和`v-for`的`key`屬性如何配合使用?優(yōu)化策略:1.虛擬滾動:使用`vue-virtual-scroller`等庫,僅渲染可見區(qū)域的列表項(如10000條數(shù)據(jù)僅渲染50條),減少DOM節(jié)點數(shù)量。核心原理是通過計算滾動位置,動態(tài)更新`v-for`的數(shù)據(jù)源(如`visibleItems=list.slice(start,end)`)。2.減少重新渲染:通過`v-memo`緩存穩(wěn)定的子樹。例如,當(dāng)列表項的某些屬性(如`id`、`name`)不變時,避免重新渲染整個項:```vue<template><divv-for="iteminlist":key="item.id"v-memo="[item.id,]"><!--復(fù)雜內(nèi)容:可能包含嵌套組件或大量計算--><ExpensiveComponent:data="item"/></div></template>````v-memo="[item.id,]"`表示僅當(dāng)`item.id`或``變化時,才重新渲染該列表項。若`item`的其他屬性(如`timestamp`)變化但不影響視圖,可避免不必要的更新。3.優(yōu)化`key`的選擇:`key`應(yīng)使用穩(wěn)定、唯一的值(如數(shù)據(jù)庫ID),避免使用數(shù)組索引(`index`)。若列表順序會變化(如拖拽排序),用索引作為`key`會導(dǎo)致所有項重新渲染(因索引與項的映射關(guān)系改變),而用唯一ID可精準(zhǔn)更新變化的項。4.懶加載圖片:對列表中的圖片使用`loading="lazy"`屬性(現(xiàn)代瀏覽器支持),或通過IntersectionObserverAPI實現(xiàn)圖片懶加載,減少初始渲染時的資源請求。VueRouter4中,如何實現(xiàn)動態(tài)權(quán)限控制?導(dǎo)航守衛(wèi)的執(zhí)行順序是怎樣的?動態(tài)權(quán)限控制步驟:1.定義權(quán)限元信息:在路由配置中通過`meta`字段添加權(quán)限要求(如`meta:{requiresAdmin:true}`)。```javascript//router.tsconstroutes=[{path:'/admin',component:AdminPage,meta:{requiresAuth:true,roles:['admin']}}];```2.全局前置守衛(wèi)校驗:在`router.beforeEach`中檢查用戶權(quán)限。若用戶未登錄且目標(biāo)路由需要認(rèn)證,跳轉(zhuǎn)登錄頁;若已登錄但權(quán)限不足,跳轉(zhuǎn)403頁。```javascriptrouter.beforeEach((to,from,next)=>{constuserStore=useUserStore();if(to.meta.requiresAuth&&!userStore.isLoggedIn){next({path:'/login',query:{redirect:to.fullPath}});}elseif(to.meta.roles&&!to.meta.roles.includes(userStore.userRole)){next({path:'/403'});}else{next();}});```3.動態(tài)添加路由:對于需要權(quán)限控制的路由(如用戶角色為`admin`時顯示管理頁面),可在用戶登錄后通過`router.addRoute`動態(tài)添加,避免未授權(quán)用戶訪問路由配置。```javascript//登錄成功后constuserStore=useUserStore();if(userStore.userRole==='admin'){router.addRoute({path:'/admin/dashboard',component:AdminDashboard,meta:{requiresAuth:true,roles:['admin']}});}```導(dǎo)航守衛(wèi)執(zhí)行順序(以完整流程為例):1.全局前置守衛(wèi)(`router.beforeEach`)2.組件內(nèi)守衛(wèi)(`beforeRouteLeave`:離開當(dāng)前組件時觸發(fā))3.路由獨享守衛(wèi)(`beforeEnter`:配置在路由對象中的守衛(wèi))4.組件內(nèi)守衛(wèi)(`beforeRouteEnter`:進入目標(biāo)組件前觸發(fā),此時組件實例未創(chuàng)建,需通過`next(vm=>{})`訪問實例)5.全局解析守衛(wèi)(`router.beforeResolve`:所有組件守衛(wèi)和異步路由組件加載完成后觸發(fā))6.全局后置鉤子(`router.afterEach`:導(dǎo)航完成后觸發(fā),無`next`參數(shù))Vue3中自定義指令的生命周期鉤子有哪些?如何實現(xiàn)一個防抖指令`v-debounce`?生命周期鉤子(與組件生命周期對應(yīng)):-`beforeMount`:指令第一次綁定到元素且元素未插入DOM時調(diào)用(僅執(zhí)行一次)。-`mounted`:元素插入DOM后調(diào)用(可操作DOM)。-`beforeUpdate`:元素更新前(包括子元素更新)調(diào)用。-`updated`:元素和子元素更新完成后調(diào)用。-`beforeUnmount`:元素被卸載前調(diào)用(清理副作用)。-`unmounted`:元素被卸載后調(diào)用。實現(xiàn)`v-debounce`指令(處理輸入框防抖):```javascript//debounce.tsimport{Directive}from'vue';constdebounce:Directive={mounted(el,binding){const{value:handler,arg:delay=300}=binding;lettimer:NodeJS.Timeout;el.addEventListener('input',(e)=>{if(timer)clearTimeout(timer);timer=setTimeout(()=>{handler(e);//執(zhí)行用戶傳入的回調(diào)(如更新表單數(shù)據(jù))},delay);});},beforeUnmount(el){//清理事件監(jiān)聽器(避免內(nèi)存泄漏)el.removeEventListener('input',()=>{});}};exportdefaultdebounce;```使用示例:```vue<template><inputv-debounce:500="handleInput"placeholder="輸入后500ms觸發(fā)"/></template><scriptsetup>importdebouncefrom'./directives/debounce';consthandleInput=(e:InputEvent)=>{console.log('輸入內(nèi)容:',(e.targetasHTMLInputElement).value);};</script>```需注意:指令參數(shù)(如`500`)通過`binding.arg`獲取,修飾符通過`binding.modifiers`獲?。ㄈ鏯v-debounce.enter`表示僅在回車時觸發(fā));若需要動態(tài)修改延遲時間,需在`updated`鉤子中重新綁定事件監(jiān)聽器。Vite相比Webpack的核心優(yōu)勢有哪些?Vue項目中如何配置Vite優(yōu)化構(gòu)建速度?核心優(yōu)勢:1.快速冷啟動:Vite基于ES模塊(ESM)的`import`特性,開發(fā)時無需打包,通過`esbuild`預(yù)構(gòu)建依賴(僅首次啟動或依賴變化時執(zhí)行),啟動時間從Webpack的數(shù)秒降至毫秒級。2.高效熱更新(HMR):Vite的HMR僅更新修改的模塊,無需重新打包整個應(yīng)用;對于Vue單文件組件(SFC),可精準(zhǔn)更新模板或腳本部分,避免全頁刷新。3.開箱即用的現(xiàn)代特性:內(nèi)置支持TypeScript、JSX、CSS預(yù)處理器(如Sass),無需額外配置;生產(chǎn)環(huán)境使用`rollup`打包,輸出更簡潔的代碼(支持Tree-shaking)。優(yōu)化構(gòu)建速度的配置:1.依賴預(yù)構(gòu)建:在`vite.config.ts`中通過`optimizeDeps`配置需要預(yù)構(gòu)建的依賴(特別是CommonJS模塊),減少開發(fā)時的請求次數(shù)。```typescript//vite.config.tsexportdefaultdefineConfig({optimizeDeps:{include:['lodash-es','axios']//預(yù)構(gòu)建這些依賴}});```2.分包策略:通過`build.rollupOptions.output.manualChunks`將大依賴單獨打包(如`vue`、`vue-router`),利用瀏覽器緩存。```typescriptexportdefaultdefineConfig({build:{rollupOptions:{output:{manualChunks:{vue:['vue','vue-router','pinia'],ui:['element-plus']}}}}});```3.啟用壓縮器優(yōu)化:使用`esbuild`替代`terser`進行代碼壓縮(速度更快,但壓縮率略低),通過`build.minify:'esbuild'`配置。4.排除不必要的資源:通過`build.assetsDir`自定義靜態(tài)資源目錄,或使用`assetsInclude`指定需要處理的資源類型(如`assetsInclude:['/.md']`),減少構(gòu)建時的資源處理量。Vue3與WebComponents結(jié)合的場景有哪些?如何通過`defineCustomElement`封裝Vue組件為自定義元素?結(jié)合場景:1.跨框架復(fù)用:將Vue組件封裝為自定義元素(如`my-button`),可在React、Angular或純HTML項目中使用,實現(xiàn)組件級別的跨技術(shù)棧共享。2.第三方集成:為第三方系統(tǒng)(如CMS)提供可嵌入的組件,通過標(biāo)準(zhǔn)HTML標(biāo)簽調(diào)用(如`<vue-chart></vue-chart>`),降低集成門檻。3.漸進式遷移:在大型項目中逐步將舊技術(shù)棧(如JQuery)的組件替換為Vue組件,通過自定義元素?zé)o縫銜接。封裝步驟(以`MyButton`組件為例):1.編寫Vue組件:支持`props`、`events`和`slots`。```vue<!--MyButton.vue--><template><buttonclass="my-btn"@click="$emit('click',$event)"><slotname="prefix"/>{{label}}<slotname="suffix"/></button></template><scri

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論