適合中高級前端vue面試的100道題目及解析
以下是 100 道 Vue 高級面試題及解析,涵蓋 Vue2、Vue3 核心原理、性能優(yōu)化、工程化等關(guān)鍵知識點(diǎn),適合中高級前端面試準(zhǔn)備:
一、Vue 核心原理(20 題)
Vue 的響應(yīng)式原理是什么?Vue2 和 Vue3 有何區(qū)別?
解析:- Vue2:基于
Object.defineProperty劫持對象屬性的getter和setter,實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式。缺陷:無法監(jiān)聽對象新增 / 刪除屬性、數(shù)組索引 / 長度變化(需通過重寫數(shù)組方法實(shí)現(xiàn))。 - Vue3:基于
Proxy代理整個(gè)對象,可監(jiān)聽對象新增 / 刪除屬性、數(shù)組變化,且無需初始化時(shí)遞歸遍歷所有屬性,性能更優(yōu)。同時(shí)使用Reflect統(tǒng)一操作對象,更符合 ES 規(guī)范。
- Vue2:基于
Vue 中的虛擬 DOM(VNode)是什么?作用是什么?
解析:虛擬 DOM 是用 JavaScript 對象描述真實(shí) DOM 的結(jié)構(gòu)(如tag、props、children等)。作用:- 減少 DOM 操作:通過對比新舊 VNode 差異(diff 算法),只更新變化的部分,降低瀏覽器重繪 / 重排成本。
- 跨平臺:VNode 可渲染到不同平臺(瀏覽器 DOM、小程序、Canvas 等)。
Vue 的 diff 算法原理是什么?有哪些優(yōu)化策略?
解析:diff 算法用于對比新舊 VNode 樹,找出差異并更新 DOM。- 核心策略:同層比較(不跨層級對比),通過
key標(biāo)識節(jié)點(diǎn)唯一性。 - 優(yōu)化點(diǎn):
- 若節(jié)點(diǎn)
tag不同,直接銷毀舊節(jié)點(diǎn)創(chuàng)建新節(jié)點(diǎn)。 - 若節(jié)點(diǎn)
tag和key相同,視為同一節(jié)點(diǎn),僅更新屬性和子節(jié)點(diǎn)。 - 列表對比時(shí),
key避免節(jié)點(diǎn)復(fù)用錯(cuò)誤(如輸入框內(nèi)容錯(cuò)亂)。
- 若節(jié)點(diǎn)
- 核心策略:同層比較(不跨層級對比),通過
Vue 的生命周期鉤子有哪些?分別在什么階段執(zhí)行?
解析:- Vue2:
beforeCreate(實(shí)例創(chuàng)建前,數(shù)據(jù)未初始化)→created(實(shí)例創(chuàng)建后,數(shù)據(jù)可用,未掛載)→beforeMount(掛載前,模板編譯完成)→mounted(掛載完成,可操作 DOM)→beforeUpdate(數(shù)據(jù)更新前)→updated(數(shù)據(jù)更新后)→beforeDestroy(實(shí)例銷毀前)→destroyed(實(shí)例銷毀后)。 - Vue3:組合式 API 中用
onBeforeMount、onMounted等替代,生命周期鉤子注冊時(shí)機(jī)更靈活,且beforeDestroy/destroyed改為onBeforeUnmount/onUnmounted。
- Vue2:
Vue 組件通信方式有哪些?適用場景是什么?
解析:- 父子通信:
props(父傳子)、$emit/v-on(子傳父)、$parent/$children(直接訪問,不推薦)。 - 跨級 / 兄弟通信:
provide/inject(依賴注入)、EventBus(事件總線,Vue3 推薦用mitt庫)、Vuex/Pinia(狀態(tài)管理)。 - 復(fù)雜場景:Vuex/Pinia(全局狀態(tài))、
$attrs/$listeners(透傳屬性和事件)。
- 父子通信:
computed和watch的區(qū)別及使用場景?
解析:computed:依賴響應(yīng)式數(shù)據(jù),緩存結(jié)果(依賴不變則不重新計(jì)算),適用于衍生數(shù)據(jù)計(jì)算(如購物車總價(jià))。watch:監(jiān)聽數(shù)據(jù)變化,可執(zhí)行異步操作,適用于數(shù)據(jù)變化后的副作用(如數(shù)據(jù)變化后請求接口)。- 注意:
computed不能直接修改,watch可通過handler執(zhí)行任意操作。
Vue 中的
key有什么作用?為什么不能用索引作為key?
解析:key是節(jié)點(diǎn)的唯一標(biāo)識,用于 diff 算法識別相同節(jié)點(diǎn)。- 若用索引作為
key,當(dāng)列表刪除 / 插入元素時(shí),索引會(huì)變化,導(dǎo)致 diff 算法誤判節(jié)點(diǎn)復(fù)用(如輸入框內(nèi)容錯(cuò)亂)。 - 推薦用唯一 ID 作為
key(如后端返回的id),確保節(jié)點(diǎn)標(biāo)識穩(wěn)定。
- 若用索引作為
Vue 的
nextTick原理及使用場景?
解析:nextTick用于在 DOM 更新完成后執(zhí)行回調(diào)。- 原理:利用瀏覽器的微任務(wù)(
Promise.then)或宏任務(wù)(setTimeout)延遲執(zhí)行回調(diào),等待當(dāng)前同步代碼執(zhí)行完畢及 DOM 更新完成。 - 場景:修改數(shù)據(jù)后立即操作更新后的 DOM(如獲取元素高度、滾動(dòng)位置)。
- 原理:利用瀏覽器的微任務(wù)(
Vue2 中的
$set和 Vue3 中的ref/reactive如何解決響應(yīng)式問題?
解析:- Vue2:
Object.defineProperty無法監(jiān)聽對象新增屬性,this.$set(obj, key, value)可手動(dòng)觸發(fā)響應(yīng)式。 - Vue3:
ref用于基本類型,reactive用于對象 / 數(shù)組,基于Proxy自動(dòng)監(jiān)聽新增 / 刪除屬性,無需手動(dòng)處理。
- Vue2:
Vue 的模板編譯過程是什么?
解析:模板→AST(抽象語法樹)→渲染函數(shù)→VNode→DOM。- 解析:將模板字符串解析為 AST(識別指令、插值等)。
- 優(yōu)化:標(biāo)記靜態(tài)節(jié)點(diǎn)(不隨數(shù)據(jù)變化的節(jié)點(diǎn)),diff 時(shí)跳過對比。
- 生成:將 AST 轉(zhuǎn)換為
render函數(shù)(返回 VNode 的函數(shù))。
Vue 中的
mixins有什么問題?Vue3 的composition API如何解決?
解析:mixins問題:命名沖突、依賴關(guān)系不明確、復(fù)用邏輯分散。
Vue3 的composition API(setup、ref、reactive等)通過邏輯組合替代mixins,將相關(guān)邏輯封裝在函數(shù)中,實(shí)現(xiàn)更清晰的代碼組織和復(fù)用。Vue3 的
composition API和 Vue2 的options API有什么區(qū)別?
解析:options API:按data、methods、computed等選項(xiàng)組織代碼,邏輯分散在不同選項(xiàng)中,復(fù)雜組件難以維護(hù)。composition API:按功能邏輯組織代碼(如表單邏輯、列表邏輯),通過setup函數(shù)集中編寫,支持邏輯復(fù)用和類型推斷。
Vue3 的
reactive和ref的區(qū)別及使用場景?
解析:reactive:用于對象 / 數(shù)組,返回代理對象,訪問時(shí)無需.value,但不能直接賦值新對象(會(huì)失去響應(yīng)性)。ref:用于基本類型(也可用于對象),返回帶有value屬性的響應(yīng)式對象,訪問 / 修改需通過.value,賦值新值仍保持響應(yīng)性。- 場景:基本類型用
ref,對象 / 數(shù)組用reactive(或ref包裹對象)。
Vue 中的
v-model原理是什么?如何自定義v-model?
解析:v-model是語法糖,本質(zhì)是value屬性 +input事件的結(jié)合。- 原生元素:
<input v-model="val">等價(jià)于<input :value="val" @input="val = $event.target.value">。 - 自定義組件:默認(rèn)通過
props: ['value']和$emit('input', newValue)實(shí)現(xiàn),可通過model選項(xiàng)修改(如model: { prop: 'checked', event: 'change' })。
- 原生元素:
Vue 的
keep-alive組件作用是什么?如何使用?
解析:keep-alive用于緩存組件實(shí)例,避免重復(fù)創(chuàng)建和銷毀,提升性能。- 用法:包裹動(dòng)態(tài)組件
<keep-alive><component :is="view"></component></keep-alive>。 - 屬性:
include(緩存指定組件)、exclude(排除指定組件)、max(最大緩存數(shù)量)。 - 生命周期:被緩存組件會(huì)觸發(fā)
activated(激活時(shí))和deactivated(失活時(shí))鉤子。
- 用法:包裹動(dòng)態(tài)組件
Vue 中的
slot(插槽)有哪些類型?如何使用?
解析:- 匿名插槽:
<slot></slot>,父組件通過默認(rèn)內(nèi)容填充。 - 具名插槽:
<slot name="header"></slot>,父組件用<template #header>指定填充。 - 作用域插槽:
<slot :user="user"></slot>,父組件可訪問子組件數(shù)據(jù)(#default="scope")。
用途:實(shí)現(xiàn)組件內(nèi)容的靈活定制(如表格列自定義、彈窗內(nèi)容定制)。
- 匿名插槽:
Vue2 和 Vue3 的
v-if與v-for優(yōu)先級有何不同?
解析:- Vue2:
v-for優(yōu)先級高于v-if,即先循環(huán)后判斷(可能導(dǎo)致性能問題)。 - Vue3:
v-if優(yōu)先級高于v-for,v-if無法訪問v-for的變量(需在外層嵌套template處理)。
建議:避免在同一元素上同時(shí)使用v-for和v-if,可通過計(jì)算屬性過濾數(shù)據(jù)。
- Vue2:
Vue 的自定義指令有哪些鉤子?如何實(shí)現(xiàn)一個(gè)自定義指令?
解析:自定義指令鉤子(Vue3):created、beforeMount、mounted、beforeUpdate、updated、beforeUnmount、unmounted。
示例(實(shí)現(xiàn)自動(dòng)聚焦指令v-focus):const focus = { mounted(el) { el.focus() } } app.directive('focus', focus)
Vue3 的
Teleport組件作用是什么?
解析:Teleport用于將組件內(nèi)容渲染到指定 DOM 節(jié)點(diǎn)(如body),解決樣式隔離和層級問題。
場景:彈窗、下拉菜單等組件,避免被父組件overflow: hidden或z-index影響。
用法:<teleport to="body"><div>彈窗內(nèi)容</div></teleport>。Vue 的依賴收集原理是什么?
解析:當(dāng)組件渲染時(shí),會(huì)觸發(fā)響應(yīng)式數(shù)據(jù)的getter,此時(shí)將當(dāng)前組件的Watcher實(shí)例收集到該數(shù)據(jù)的依賴列表中(dep)。當(dāng)數(shù)據(jù)變化時(shí),setter會(huì)通知dep中的所有Watcher觸發(fā)組件重新渲染。這是 Vue 響應(yīng)式的核心機(jī)制。
二、Vuex/Pinia(15 題)
Vuex 的核心概念有哪些?各自的作用是什么?
解析:state:存儲全局狀態(tài)(唯一數(shù)據(jù)源)。getters:派生狀態(tài)(類似computed,緩存結(jié)果)。mutations:修改state的唯一途徑,同步操作(必須是純函數(shù))。actions:處理異步操作,通過commit調(diào)用mutations。modules:將 store 拆分為模塊(解決單一狀態(tài)樹過大問題)。
Vuex 中
mutations和actions的區(qū)別?
解析:- 同步 vs 異步:
mutations只能執(zhí)行同步操作,actions可執(zhí)行異步操作(如 API 請求)。 - 調(diào)用方式:
mutations通過store.commit調(diào)用,actions通過store.dispatch調(diào)用。 - 修改狀態(tài):
actions不能直接修改state,必須通過commit調(diào)用mutations。
- 同步 vs 異步:
Vuex 的
module中namespaced: true的作用是什么?
解析:開啟命名空間后,模塊內(nèi)的mutations、actions、getters會(huì)被限定在模塊內(nèi),避免全局命名沖突。調(diào)用時(shí)需指定模塊路徑(如commit('user/login'))。如何在組件中訪問 Vuex 的
state和getters?
解析:- 直接訪問:
this.$store.state.xxx、this.$store.getters.xxx。 - 輔助函數(shù):
mapState、mapGetters(簡化代碼):import { mapState, mapGetters } from 'vuex' computed: { ...mapState(['count']), ...mapGetters(['doubleCount']) }
- 直接訪問:
Vuex 的持久化方案有哪些?
解析:Vuex 狀態(tài)默認(rèn)存儲在內(nèi)存中,刷新頁面會(huì)丟失。解決方案:- 手動(dòng)存儲:在
mutations中用localStorage/sessionStorage保存。 - 插件:
vuex-persistedstate(自動(dòng)將指定狀態(tài)同步到本地存儲)。
- 手動(dòng)存儲:在
Vuex 存在哪些缺點(diǎn)?
解析:- 寫法繁瑣(需定義
mutations、actions等)。 - 類型支持差(Vue2 中難以實(shí)現(xiàn) TypeScript 類型推斷)。
- 模塊化復(fù)雜(命名空間配置繁瑣)。
- 不適用于小型項(xiàng)目(過度設(shè)計(jì))。
- 寫法繁瑣(需定義
Pinia 和 Vuex 的區(qū)別是什么?為什么說 Pinia 是 Vuex 的替代品?
解析:Pinia 是 Vue 官方推薦的狀態(tài)管理庫,解決了 Vuex 的缺點(diǎn):- 簡化 API:無需
mutations,直接在actions中修改狀態(tài)。 - 更好的 TypeScript 支持:天然支持類型推斷。
- 無需命名空間:模塊本身就是獨(dú)立的,默認(rèn)支持模塊嵌套。
- 更簡潔的語法:用
defineStore定義倉庫,調(diào)用更直觀。
- 簡化 API:無需
Pinia 的核心概念有哪些?
解析:defineStore:定義倉庫(參數(shù)包括id、state、getters、actions)。state:存儲狀態(tài)(函數(shù)返回對象,支持直接修改)。getters:派生狀態(tài)(支持緩存和訪問其他 getters)。actions:處理同步 / 異步操作(可直接修改state)。
Pinia 中如何修改
state?
解析:- 直接修改:
store.count++(Pinia 允許直接修改 state,無需mutations)。 - 批量修改:
store.$patch({ count: 10, name: 'foo' })或store.$patch((state) => { state.count++ })。 - 在
actions中修改:actions: { increment() { this.count++ } }。
- 直接修改:
Pinia 如何實(shí)現(xiàn)模塊間通信?
解析:在一個(gè)模塊的actions中,可直接導(dǎo)入并使用其他模塊的倉庫:import { useUserStore } from './user' export const useCartStore = defineStore('cart', { actions: { addItem(item) { const userStore = useUserStore() if (userStore.isLogin) { this.items.push(item) } } } })Vuex/Pinia 的
getters是否可以異步?
解析:- Vuex 的
getters是同步的(基于state派生,無法處理異步)。 - Pinia 的
getters默認(rèn)同步,但可返回Promise實(shí)現(xiàn)異步(需在組件中用await獲?。?/li>
- Vuex 的
如何在 Vue3 的
setup中使用 Vuex 和 Pinia?
解析:- Vuex:
import { useStore } from 'vuex',const store = useStore(),通過store.state訪問。 - Pinia:
import { useStore } from './stores',const store = useStore(),直接調(diào)用store的屬性和方法。
- Vuex:
Vuex 的
strict模式有什么作用?
解析:strict: true開啟嚴(yán)格模式后,任何未通過mutations修改state的操作都會(huì)報(bào)錯(cuò),有助于規(guī)范代碼(生產(chǎn)環(huán)境建議關(guān)閉,避免性能損耗)。Pinia 如何實(shí)現(xiàn)狀態(tài)持久化?
解析:- 手動(dòng)實(shí)現(xiàn):在
actions中用localStorage保存,state初始化時(shí)讀取。 - 插件:
pinia-plugin-persistedstate(配置簡單,支持指定字段持久化)。
- 手動(dòng)實(shí)現(xiàn):在
Vuex 和 Pinia 在大型項(xiàng)目中如何組織目錄結(jié)構(gòu)?
解析:- Vuex:按模塊拆分,每個(gè)模塊包含
state.js、mutations.js、actions.js、getters.js,根目錄index.js整合。 - Pinia:每個(gè)倉庫單獨(dú)一個(gè)文件(如
user.js、cart.js),根目錄index.js導(dǎo)出所有倉庫。
- Vuex:按模塊拆分,每個(gè)模塊包含
三、Vue Router(15 題)
Vue Router 的核心概念有哪些?
解析:routes(路由配置)、router(路由實(shí)例)、route(當(dāng)前路由信息)、router-link(導(dǎo)航組件)、router-view(路由出口)。Vue Router 的兩種模式(
hash和history)有何區(qū)別?
解析:hash模式:URL 帶#(如http://xxx/#/home),#后的內(nèi)容不發(fā)送到服務(wù)器,兼容性好(支持所有瀏覽器)。history模式:URL 無#(如http://xxx/home),依賴 HTML5 的historyAPI,需服務(wù)器配置(避免刷新 404),美觀但兼容性稍差(IE10+)。
如何配置嵌套路由?
解析:在routes配置中,通過children屬性定義子路由,子路由路徑一般不加/(相對父路由)。const routes = [ { path: '/user', component: User, children: [ { path: 'profile', component: UserProfile }, // 匹配 /user/profile { path: 'posts', component: UserPosts } // 匹配 /user/posts ] } ]Vue Router 的動(dòng)態(tài)路由匹配如何實(shí)現(xiàn)?如何獲取參數(shù)?
解析:用:param定義動(dòng)態(tài)參數(shù)(如path: '/user/:id')。- 獲取參數(shù):
this.$route.params(Vue2)或route.params(Vue3setup中)。 - 注意:動(dòng)態(tài)路由參數(shù)變化時(shí),組件不會(huì)重新創(chuàng)建,需用
watch監(jiān)聽$route.params或使用beforeRouteUpdate導(dǎo)航守衛(wèi)。
- 獲取參數(shù):
如何實(shí)現(xiàn)路由跳轉(zhuǎn)?有哪些方式?
解析:- 聲明式:
<router-link to="/home">首頁</router-link>(自動(dòng)渲染為<a>標(biāo)簽)。 - 編程式:
this.$router.push('/home')(Vue2)或router.push('/home')(Vue3),支持路徑字符串、對象({ path: '/home' })或命名路由({ name: 'Home' })。
- 聲明式:
路由守衛(wèi)有哪些類型?各自的作用是什么?
解析:- 全局守衛(wèi):
beforeEach(路由跳轉(zhuǎn)前)、beforeResolve(組件解析后)、afterEach(路由跳轉(zhuǎn)后)。 - 路由獨(dú)享守衛(wèi):
beforeEnter(僅作用于當(dāng)前路由)。 - 組件內(nèi)守衛(wèi):
beforeRouteEnter(進(jìn)入組件前)、beforeRouteUpdate(路由參數(shù)變化時(shí))、beforeRouteLeave(離開組件前)。
用途:權(quán)限控制、登錄驗(yàn)證、頁面離開提示等。
- 全局守衛(wèi):
beforeRouteEnter中為什么不能直接訪問this?如何解決?
解析:beforeRouteEnter在組件實(shí)例創(chuàng)建前調(diào)用,因此this未定義。可通過回調(diào)函數(shù)訪問實(shí)例:beforeRouteEnter(to, from, next) { next(vm => { // vm 是組件實(shí)例 vm.fetchData() }) }如何實(shí)現(xiàn)路由懶加載?有什么好處?
解析:通過動(dòng)態(tài)import實(shí)現(xiàn)組件按需加載,減少初始打包體積,提升首屏加載速度。const Home = () => import('@/views/Home.vue') const routes = [{ path: '/home', component: Home }]進(jìn)階:結(jié)合
webpackChunkName分組加載(如import(/* webpackChunkName: "user" */ '@/views/User.vue'))。Vue Router 如何傳遞查詢參數(shù)(query)和路由參數(shù)(params)?
解析:- 查詢參數(shù)(query):類似 URL 中的
?key=value,通過router.push({ path: '/user', query: { id: 1 } })傳遞,獲取用$route.query。 - 路由參數(shù)(params):通過動(dòng)態(tài)路由
/user/:id定義,router.push({ name: 'User', params: { id: 1 } })傳遞(需用命名路由),獲取用$route.params。
區(qū)別:query參數(shù)會(huì)顯示在 URL 中,刷新不丟失;params參數(shù)默認(rèn)不顯示,刷新會(huì)丟失(需配合動(dòng)態(tài)路由)。
- 查詢參數(shù)(query):類似 URL 中的
如何實(shí)現(xiàn)路由重定向和別名?
解析:- 重定向(redirect):
{ path: '/', redirect: '/home' }(訪問/跳轉(zhuǎn)到/home),支持函數(shù)動(dòng)態(tài)返回目標(biāo)路由。 - 別名(alias):
{ path: '/home', component: Home, alias: '/index' }(/index和/home訪問同一組件)。
- 重定向(redirect):
$router和$route的區(qū)別?
解析:$router:路由實(shí)例對象,包含路由跳轉(zhuǎn)方法(push、replace等)和全局配置。$route:當(dāng)前路由信息對象,包含path、params、query、meta等路由相關(guān)數(shù)據(jù)。
如何在路由配置中添加元信息(
meta)?有什么用途?
解析:meta用于存儲路由的額外信息(如標(biāo)題、權(quán)限要求)。const routes = [{ path: '/admin', component: Admin, meta: { requiresAuth: true, title: '管理員頁面' } }]用途:在全局守衛(wèi)中判斷權(quán)限(
to.meta.requiresAuth)、動(dòng)態(tài)設(shè)置頁面標(biāo)題(document.title = to.meta.title)。如何實(shí)現(xiàn)嵌套路由的默認(rèn)子路由?
解析:在children中配置path: ''的路由作為默認(rèn)子路由:{ path: '/user', component: User, children: [ { path: '', component: UserProfile }, // 默認(rèn)顯示UserProfile { path: 'posts', component: UserPosts } ] }Vue Router 的
scrollBehavior作用是什么?
解析:控制路由跳轉(zhuǎn)時(shí)頁面的滾動(dòng)位置(如返回頂部、保持滾動(dòng)位置)。const router = new VueRouter({ scrollBehavior(to, from, savedPosition) { if (savedPosition) { return savedPosition; // 后退時(shí)恢復(fù)滾動(dòng)位置 } else { return { x: 0, y: 0 }; // 默認(rèn)滾動(dòng)到頂部 } } })Vue3 中如何使用 Vue Router?與 Vue2 有何區(qū)別?
解析:Vue3 中使用createRouter和createWebHistory(或createWebHashHistory)創(chuàng)建路由實(shí)例,通過useRouter和useRoute在setup中訪問。
區(qū)別:- 實(shí)例創(chuàng)建方式:Vue2 用
new VueRouter(),Vue3 用createRouter()。 - 模式配置:Vue3 通過
history選項(xiàng)指定(createWebHistory()),Vue2 通過mode選項(xiàng)。 - 組合式 API:Vue3 支持在
setup中用useRouter/useRoute,無需this。
- 實(shí)例創(chuàng)建方式:Vue2 用
四、性能優(yōu)化(15 題)
Vue 項(xiàng)目的性能優(yōu)化有哪些方向?
解析:- 代碼層面:合理使用
v-if/v-show、避免不必要的響應(yīng)式數(shù)據(jù)、優(yōu)化watch和computed。 - 組件層面:拆分大型組件、使用
keep-alive緩存組件、異步組件。 - 渲染層面:列表優(yōu)化(
key、虛擬滾動(dòng))、減少 DOM 操作、優(yōu)化重繪 / 重排。 - 構(gòu)建層面:路由懶加載、代碼分割、Tree-shaking、壓縮資源。
- 網(wǎng)絡(luò)層面:接口緩存、圖片優(yōu)化(懶加載、壓縮)、CDN 加速。
- 代碼層面:合理使用
v-if和v-show如何選擇以優(yōu)化性能?
解析:v-if:條件不滿足時(shí)組件會(huì)被銷毀(DOM 移除),適合條件不常變化的場景(如權(quán)限控制)。v-show:條件不滿足時(shí)組件僅隱藏(display: none),適合條件頻繁變化的場景(如切換標(biāo)簽)。
原則:頻繁切換用v-show,一次性判斷用v-if。
如何優(yōu)化 Vue 的列表渲染性能?
解析:- 用唯一
key標(biāo)識節(jié)點(diǎn),避免復(fù)用錯(cuò)誤。 - 大數(shù)據(jù)列表用虛擬滾動(dòng)(如
vue-virtual-scroller),只渲染可視區(qū)域內(nèi)的元素。 - 避免在
v-for中使用v-if,可通過計(jì)算屬性過濾數(shù)據(jù)。 - 固定高度列表可設(shè)置
scrollTop緩存滾動(dòng)位置。
- 用唯一
如何減少 Vue 的響應(yīng)式開銷?
解析:- 非響應(yīng)式數(shù)據(jù):用
Object.freeze()凍結(jié)無需響應(yīng)式的對象(如靜態(tài)數(shù)據(jù))。 - 合理使用
ref和reactive:基本類型用ref,避免將所有數(shù)據(jù)放入reactive。 - 拆分響應(yīng)式對象:將大對象拆分為多個(gè)小對象,避免不必要的依賴收集。
- Vue3 的
shallowRef/shallowReactive:用于不需要深層響應(yīng)式的場景。
- 非響應(yīng)式數(shù)據(jù):用
keep-alive的使用場景和注意事項(xiàng)?
解析:場景:需要緩存狀態(tài)的組件(如表單頁面、詳情頁),避免重復(fù)請求數(shù)據(jù)或重置狀態(tài)。
注意:- 緩存過多會(huì)占用內(nèi)存,需配合
include/exclude限制范圍。 - 被緩存組件的
mounted鉤子只會(huì)執(zhí)行一次,需用activated處理每次激活邏輯。
- 緩存過多會(huì)占用內(nèi)存,需配合
Vue 項(xiàng)目如何實(shí)現(xiàn)圖片懶加載?
解析:- 第三方庫:使用
vue-lazyload插件,通過v-lazy指令綁定圖片路徑。 - 原生實(shí)現(xiàn):監(jiān)聽
scroll事件,判斷圖片進(jìn)入視口后設(shè)置src屬性(結(jié)合IntersectionObserver更高效)。
好處:減少初始加載的圖片請求,提升首屏加載速度。
- 第三方庫:使用
如何優(yōu)化 Vue 的打包體積?
解析:- 路由懶加載:按路由拆分代碼,避免一次性加載所有組件。
- 第三方庫按需引入:如 Element UI 用
babel-plugin-component只引入需要的組件。 - Tree-shaking:通過
mode: 'production'啟用,移除未使用的代碼。 - 壓縮資源:JS/CSS 壓縮(
terser-webpack-plugin、css-minimizer-webpack-plugin)、圖片壓縮。 - 分析工具:用
webpack-bundle-analyzer查看包體積,針對性優(yōu)化。
Vue 的事件委托如何優(yōu)化性能?
解析:將子元素的事件監(jiān)聽委托給父元素,減少事件監(jiān)聽器數(shù)量(尤其列表場景)。
示例:<ul @click="handleClick"> <li v-for="item in list" :key="item.id" :data-id="item.id">{{ item.name }}</li> </ul>handleClick(e) { const id = e.target.dataset.id; if (id) { /* 處理邏輯 */ } }如何避免 Vue 中的內(nèi)存泄漏?
解析:- 清除定時(shí)器:在
beforeUnmount中用clearTimeout/clearInterval銷毀。 - 移除事件監(jiān)聽:用
removeEventListener解綁手動(dòng)添加的事件。 - 解除 DOM 引用:組件銷毀前,將指向 DOM 元素的變量設(shè)為
null。 - 清理第三方庫實(shí)例:如地圖、圖表庫,需調(diào)用
destroy方法。
- 清除定時(shí)器:在
Vue3 的
setup函數(shù)中如何優(yōu)化性能?
解析:- 避免在
setup中創(chuàng)建不必要的函數(shù)(可提取到外部或用useMemo緩存)。 - 用
shallowRef/shallowReactive處理不需要深層響應(yīng)式的數(shù)據(jù)。 - 用
watchEffect的onCleanup清理副作用(如定時(shí)器、事件監(jiān)聽)。 - 組件通信優(yōu)先用
props和emit,減少provide/inject的過度使用。
- 避免在
如何優(yōu)化 Vue 的首屏加載速度?
解析:- 減小入口文件體積:路由懶加載、按需引入庫。
- 靜態(tài)資源優(yōu)化:圖片壓縮、使用 CDN、啟用 Gzip/Brotli 壓縮。
- 預(yù)加載關(guān)鍵資源:
<link rel="preload">提前加載核心 CSS/JS。 - 服務(wù)端優(yōu)化:SSR(服務(wù)端渲染)或 SSG(靜態(tài)站點(diǎn)生成),如 Nuxt.js。
- 合理利用緩存:HTTP 緩存(
Cache-Control)、Service Worker 緩存。
Vue 中的
transition和transition-group如何優(yōu)化動(dòng)畫性能?
解析:- 用
transform和opacity實(shí)現(xiàn)動(dòng)畫(觸發(fā)合成層,避免重排)。 - 避免在動(dòng)畫中修改
width、height等會(huì)引發(fā)重排的屬性。 - 對大量元素動(dòng)畫用
transition-group,并設(shè)置tag屬性指定容器標(biāo)簽。 - 復(fù)雜動(dòng)畫可使用
requestAnimationFrame或 Web Animations API。
- 用
Vue 項(xiàng)目中如何使用 Web Worker?
解析:Web Worker 用于在后臺線程處理耗時(shí)任務(wù)(如大數(shù)據(jù)計(jì)算),避免阻塞主線程。
步驟:- 創(chuàng)建 worker 文件(
worker.js),編寫計(jì)算邏輯。 - 在 Vue 組件中實(shí)例化
new Worker('worker.js')。 - 通過
postMessage和onmessage通信。
注意:Worker 中不能訪問 DOM 和 Vue 實(shí)例,需通過消息傳遞結(jié)果。
- 創(chuàng)建 worker 文件(
如何優(yōu)化 Vue 的計(jì)算屬性(
computed)和監(jiān)聽器(watch)?
解析:computed:依賴盡量精簡,避免復(fù)雜計(jì)算(可拆分為多個(gè)computed)。watch:使用immediate: true代替初始化時(shí)手動(dòng)調(diào)用,用deep: true時(shí)注意性能(可監(jiān)聽具體屬性)。- Vue3 中用
watchEffect自動(dòng)追蹤依賴,比watch更簡潔。
Vue 項(xiàng)目的 SEO 優(yōu)化有哪些方案?
解析:- SSR(服務(wù)端渲染):如 Nuxt.js,讓搜索引擎抓取完整 HTML。
- SSG(靜態(tài)站點(diǎn)生成):預(yù)渲染頁面為 HTML,適合內(nèi)容固定的場景。
- 合理使用
meta標(biāo)簽:title、description、keywords。 - 語義化 HTML:使用
<h1>-<h6>、<article>等標(biāo)簽。 - 動(dòng)態(tài)渲染:通過服務(wù)端將 JS 渲染的內(nèi)容轉(zhuǎn)換為 HTML 返回給搜索引擎。
五、工程化與生態(tài)(15 題)
Vue CLI 的核心功能是什么?如何自定義 Vue CLI 配置?
解析:Vue CLI 是官方腳手架工具,核心功能:項(xiàng)目初始化、開發(fā)服務(wù)器、代碼編譯、打包構(gòu)建。
自定義配置:- 通過
vue.config.js修改 Webpack 配置(如configureWebpack、chainWebpack)。 - 配置環(huán)境變量(
.env.development、.env.production)。 - 自定義入口文件、輸出路徑等。
- 通過
Vite 和 Vue CLI 的區(qū)別是什么?為什么 Vite 更快?
解析:- 原理不同:Vue CLI 基于 Webpack(打包后開發(fā)),Vite 基于 ES Modules(按需編譯,無需打包)。
- 速度差異:Vite 開發(fā)環(huán)境啟動(dòng)快(無需打包)、熱更新快(只更新修改的模塊),生產(chǎn)環(huán)境仍用 Rollup 打包。
- 適用場景:Vite 適合現(xiàn)代瀏覽器項(xiàng)目,Vue CLI 兼容性更好(支持舊瀏覽器)。
Vue 項(xiàng)目中如何使用 TypeScript?
解析:- 初始化:
vue create時(shí)選擇 TypeScript,或用 Vite 創(chuàng)建vue-ts模板。 - 組件寫法:用
defineComponent定義組件,指定props和emits的類型。 - 類型聲明:為全局變量、模塊擴(kuò)展編寫
.d.ts聲明文件。 - 優(yōu)勢:類型檢查、IDE 智能提示、減少運(yùn)行時(shí)錯(cuò)誤。
- 初始化:
Vue 項(xiàng)目的目錄結(jié)構(gòu)如何設(shè)計(jì)更合理?
解析:src/ ├── assets/ # 靜態(tài)資源(圖片、樣式) ├── components/ # 通用組件 │ ├── common/ # 基礎(chǔ)組件(按鈕、輸入框) │ ├── business/ # 業(yè)務(wù)組件 ├── views/ # 頁面組件(路由對應(yīng)的組件) ├── router/ # 路由配置 ├── store/ # 狀態(tài)管理(Vuex/Pinia) ├── utils/ # 工具函數(shù) ├── api/ # 接口請求 ├── hooks/ # 自定義鉤子(Vue3) ├── App.vue # 根組件 └── main.js # 入口文件
Vue 項(xiàng)目中如何統(tǒng)一管理 API 請求?
解析:- 封裝
axios:設(shè)置基礎(chǔ) URL、請求攔截器(加 token)、響應(yīng)攔截器(處理錯(cuò)誤)。 - 按模塊組織 API:
api/user.js、api/goods.js,每個(gè)模塊導(dǎo)出相關(guān)接口函數(shù)。 - 使用環(huán)境變量:不同環(huán)境(開發(fā) / 生產(chǎn))的 API 地址通過
.env文件配置。
示例:
// api/user.js import request from '@/utils/request' export const getUserInfo = (id) => request.get(`/user/${id}`)- 封裝
Vue 組件的樣式隔離方案有哪些?
解析:- Scoped CSS:
<style scoped>,通過添加屬性選擇器實(shí)現(xiàn)樣式隔離(子組件根元素會(huì)繼承父組件樣式)。 - CSS Modules:
<style module>,類名自動(dòng)哈?;?,通過$style.class引用,完全隔離。 - CSS-in-JS:如
styled-components,用 JS 編寫樣式,組件級隔離。 - BEM 命名規(guī)范:通過命名約定(
block__element--modifier)避免沖突。
- Scoped CSS:
Vue 項(xiàng)目如何實(shí)現(xiàn)多環(huán)境配置?
解析:- 環(huán)境文件:
.env.development(開發(fā))、.env.production(生產(chǎn))、.env.test(測試),定義變量(如VUE_APP_API_URL)。 - 啟動(dòng)命令:在
package.json中配置"serve": "vue-cli-service serve --mode development"。 - 代碼中使用:
process.env.VUE_APP_API_URL(Vue3/Vite 中用import.meta.env)。
- 環(huán)境文件:
Vue 項(xiàng)目中如何進(jìn)行單元測試?
解析:- 工具:Jest(測試框架)+ Vue Test Utils(Vue 測試工具庫)。
- 測試內(nèi)容:組件渲染、事件觸發(fā)、計(jì)算屬性、Vuex/actions 等。
- 示例:測試按鈕點(diǎn)擊事件
import { mount } from '@vue/test-utils' import Button from '@/components/Button.vue' test('click event', async () => { const wrapper = mount(Button) await wrapper.trigger('click') expect(wrapper.emitted('click')).toBeTruthy() })Vue3 的
SFC(單文件組件)與 Vue2 相比有哪些改進(jìn)?
解析:<script setup>:簡化組合式 API 寫法,無需export default和setup函數(shù)。- 更好的 TypeScript 支持:
defineProps、defineEmits原生支持類型推斷。 - 樣式特性:
:deep()穿透scoped樣式、::v-slotted作用于插槽內(nèi)容。 - 性能優(yōu)化:模板編譯更高效,生成的代碼體積更小。
Vue 項(xiàng)目中如何集成 ESLint 和 Prettier?
解析:- 安裝依賴:
eslint、eslint-plugin-vue、prettier、eslint-config-prettier(解決沖突)。 - 配置文件:
.eslintrc.js(ESLint 規(guī)則)、.prettierrc(Prettier 格式規(guī)則)。 - 自動(dòng)修復(fù):VS Code 配置保存時(shí)自動(dòng)修復(fù)(
editor.codeActionsOnSave: { "source.fixAll.eslint": true })。
- 安裝依賴:
Nuxt.js 的核心功能是什么?與 Vue 有何關(guān)系?
解析:Nuxt.js 是基于 Vue 的服務(wù)端渲染(SSR)框架,核心功能:- SSR/SSG:服務(wù)端渲染提升首屏速度和 SEO。
- 路由自動(dòng)生成:基于
pages目錄結(jié)構(gòu)自動(dòng)配置路由。 - 內(nèi)置組件:
nuxt-link、nuxt-head等簡化開發(fā)。 - 中間件:處理全局權(quán)限、重定向等邏輯。
關(guān)系:Nuxt.js 是 Vue 的上層框架,擴(kuò)展了 Vue 的功能,適合構(gòu)建 SEO 友好的應(yīng)用。
Vue 項(xiàng)目中如何實(shí)現(xiàn)主題切換功能?
解析:- CSS 變量:定義
--primary-color等變量,通過 JS 修改document.documentElement.style切換。 - 類名切換:為
html或body添加主題類(如theme-dark),在 CSS 中定義不同主題樣式。 - 動(dòng)態(tài)引入樣式:通過
import()動(dòng)態(tài)加載不同主題的 CSS 文件。 - 配合
localStorage保存用戶主題偏好。
- CSS 變量:定義
Vue 組件庫(如 Element UI、Ant Design Vue)的按需引入原理是什么?
解析:通過babel-plugin-component等插件,在編譯時(shí)只引入組件的核心代碼和樣式,而非整個(gè)庫。
原理:解析import語句,將import { Button } from 'element-ui'轉(zhuǎn)換為只引入Button組件的代碼和對應(yīng)的 CSS,減少打包體積。Vue 項(xiàng)目中如何處理跨域問題?
解析:- 開發(fā)環(huán)境:通過 Vue CLI/Vite 的代理配置(
devServer.proxy)轉(zhuǎn)發(fā)請求,避免跨域。// vue.config.js module.exports = { devServer: { proxy: { '/api': { target: 'http://backend.com', changeOrigin: true } } } } - 生產(chǎn)環(huán)境:后端配置 CORS(
Access-Control-Allow-Origin)或通過 Nginx 反向代理。
- 開發(fā)環(huán)境:通過 Vue CLI/Vite 的代理配置(
Vue3 的
defineProps和defineEmits與 Vue2 的props和$emit有何區(qū)別?
解析:- Vue2:
props在選項(xiàng)中聲明,$emit通過this.$emit調(diào)用,類型檢查需手動(dòng)實(shí)現(xiàn)。 - Vue3:
defineProps和defineEmits是編譯時(shí)宏,無需導(dǎo)入,支持 TypeScript 類型聲明,更簡潔且類型安全:const props = defineProps<{ name: string; age?: number }>() const emit = defineEmits<{ (e: 'change', value: string): void }>()
- Vue2:
六、綜合與拓展(20 題)
Vue 和 React 的區(qū)別是什么?
解析:- 核心思想:Vue 強(qiáng)調(diào)漸進(jìn)式框架(靈活選擇功能),React 強(qiáng)調(diào)組件化和 JSX(一切皆組件)。
- 模板 vs JSX:Vue 用 HTML 模板(可選 JSX),React 用 JSX(HTML 在 JS 中)。
- 響應(yīng)式:Vue 自動(dòng)響應(yīng)式(Vue2
Object.defineProperty,Vue3Proxy),React 需手動(dòng)調(diào)用setState或用useState。 - 狀態(tài)管理:Vue 有 Vuex/Pinia,React 有 Redux/MobX/Context API。
- 生態(tài):Vue 生態(tài)更集成(官方路由、狀態(tài)管理),React 更靈活(社區(qū)方案多)。
Vue2 升級到 Vue3 需要注意哪些問題?
解析:- 響應(yīng)式系統(tǒng)變化:
Object.defineProperty→Proxy,需注意this.$set替換為直接賦值。 - 生命周期調(diào)整:
beforeDestroy→beforeUnmount,destroyed→unmounted。 - 移除 API:
$on、$off、$once(事件總線需用第三方庫)、filter(建議用computed替代)。 - 組件寫法:推薦
composition API和<script setup>,options API仍支持但不推薦。 - 第三方庫兼容性:需升級支持 Vue3 的 UI 庫(如 Element Plus 替代 Element UI)。
- 響應(yīng)式系統(tǒng)變化:
Vue 中如何實(shí)現(xiàn)權(quán)限控制?
解析:- 路由權(quán)限:在路由守衛(wèi)(
beforeEach)中判斷用戶權(quán)限,無權(quán)限則重定向到登錄頁或 403 頁。 - 按鈕權(quán)限:通過自定義指令(如
v-permission)或組件封裝,根據(jù)權(quán)限顯示 / 隱藏按鈕。 - 數(shù)據(jù)權(quán)限:請求接口時(shí)攜帶用戶權(quán)限信息,后端返回對應(yīng)權(quán)限的數(shù)據(jù)。
示例:路由守衛(wèi)控制
router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !store.state.isLogin) { next('/login'); } else { next(); } });- 路由權(quán)限:在路由守衛(wèi)(
Vue 中如何處理表單驗(yàn)證?
解析:- 原生驗(yàn)證:利用 HTML5 表單屬性(
required、pattern)配合v-model。 - 第三方庫:使用
VeeValidate或Vuelidate,支持復(fù)雜驗(yàn)證規(guī)則和錯(cuò)誤提示。 - 自定義驗(yàn)證:在
watch或@input事件中編寫驗(yàn)證邏輯,存儲錯(cuò)誤信息并展示。 - Element UI/Plus:內(nèi)置
el-form和el-form-item組件,通過rules屬性配置驗(yàn)證規(guī)則。
- 原生驗(yàn)證:利用 HTML5 表單屬性(
Vue 中如何實(shí)現(xiàn)國際化(i18n)?
解析:使用vue-i18n庫:- 定義語言包(
en.js、zh.js)。 - 初始化
i18n實(shí)例并注入 Vue。 - 在模板中用
{{ $t('message.hello') }},在 JS 中用this.$t('message.hello')。 - 通過
this.$i18n.locale = 'en'切換語言。
- 定義語言包(
Vue 項(xiàng)目中如何實(shí)現(xiàn) WebSocket 實(shí)時(shí)通信?
解析:- 原生 WebSocket:在組件
mounted中創(chuàng)建連接,onmessage處理消息,beforeUnmount關(guān)閉連接。 - 第三方庫:使用
socket.io-client簡化操作,支持重連、事件監(jiān)聽等。
示例:
mounted() { this.socket = new WebSocket('ws://localhost:8080'); this.socket.onmessage = (e) => { this.handleMessage(JSON.parse(e.data)); }; }, beforeUnmount() { this.socket.close(); }- 原生 WebSocket:在組件
Vue 中如何實(shí)現(xiàn)打印功能?
解析:- 原生
window.print():配合@media print樣式控制打印內(nèi)容。 - 第三方庫:
vue-print-nb插件,通過v-print指令指定打印區(qū)域。 - 實(shí)現(xiàn)思路:隱藏不需要打印的元素,調(diào)用
print(),打印后恢復(fù)樣式。
- 原生
Vue3 的
provide和inject與 Vuex 有何區(qū)別?
解析:provide/inject:用于跨級組件通信,非響應(yīng)式(Vue3 中需配合ref/reactive實(shí)現(xiàn)響應(yīng)式),適合簡單場景。- Vuex:全局狀態(tài)管理,支持響應(yīng)式、狀態(tài)追蹤、模塊化,適合復(fù)雜應(yīng)用的全局狀態(tài)共享。
選擇:局部跨級通信用provide/inject,全局狀態(tài)用 Vuex/Pinia。
Vue 中的 “單向數(shù)據(jù)流” 原則是什么?如何理解?
解析:數(shù)據(jù)從父組件通過props流向子組件,子組件不能直接修改props(需通過$emit通知父組件修改)。
目的:避免數(shù)據(jù)流向混亂,便于調(diào)試和維護(hù)。若子組件需修改props,可在data中定義本地變量接收props,或用computed處理。Vue 中如何實(shí)現(xiàn)拖拽功能?
解析:- 原生實(shí)現(xiàn):監(jiān)聽
mousedown、mousemove、mouseup事件,計(jì)算位移并修改元素style.left/top。 - 第三方庫:
vuedraggable(基于Sortable.js),支持列表拖拽排序。
示例:簡單拖拽
const handleMousedown = (e) => { const startX = e.clientX; const startY = e.clientY; const startLeft = parseInt(el.style.left) || 0; const startTop = parseInt(el.style.top) || 0; const handleMousemove = (e) => { el.style.left = startLeft + (e.clientX - startX) + 'px'; el.style.top = startTop + (e.clientY - startY) + 'px'; }; document.addEventListener('mousemove', handleMousemove); document.addEventListener('mouseup', () => { document.removeEventListener('mousemove', handleMousemove); }); };- 原生實(shí)現(xiàn):監(jiān)聽
Vue 項(xiàng)目中如何處理大數(shù)據(jù)可視化?
解析:- 選擇輕量庫:中小型圖表用
echarts或chart.js,大型復(fù)雜圖表用G2或D3.js。 - 性能優(yōu)化:數(shù)據(jù)分片加載、圖表懶渲染、避免頻繁重繪(使用
requestAnimationFrame)。 - Web Worker:將數(shù)據(jù)處理邏輯放入 Worker,避免阻塞主線程。
- 組件封裝:將圖表封裝為組件,通過
props傳遞數(shù)據(jù),支持動(dòng)態(tài)更新。
- 選擇輕量庫:中小型圖表用
Vue 中的 “混入”(
mixins)和 “組合式 API”(composition API)哪個(gè)更適合邏輯復(fù)用?為什么?
解析:組合式 API 更適合,原因:- 避免命名沖突:
mixins的屬性和方法可能沖突,組合式 API 通過函數(shù)封裝,變量作用域隔離。 - 邏輯清晰:組合式 API 按功能組織代碼,可清晰看到邏輯來源,
mixins邏輯分散。 - 類型友好:組合式 API 更好地支持 TypeScript 類型推斷,
mixins類型難以維護(hù)。
- 避免命名沖突:
Vue3 的
ref為什么需要.value訪問?
解析:ref用于包裝基本類型(如number、string),使其具有響應(yīng)性。ref返回的是一個(gè)對象({ value: ... }),因?yàn)?JavaScript 中基本類型按值傳遞,對象按引用傳遞,通過.value才能觸發(fā)Proxy的攔截,實(shí)現(xiàn)響應(yīng)式更新。
注意:在<script setup>的模板中使用ref變量時(shí),Vue 會(huì)自動(dòng)解包,無需.value。Vue 中如何實(shí)現(xiàn)虛擬滾動(dòng)列表?
解析:虛擬滾動(dòng)只渲染可視區(qū)域內(nèi)的列表項(xiàng),適合大數(shù)據(jù)列表(如 10 萬 + 條數(shù)據(jù))。- 原理:計(jì)算可視區(qū)域高度、每項(xiàng)高度,確定需要渲染的起始和結(jié)束索引,通過
transform偏移列表容器,模擬滾動(dòng)效果。 - 庫推薦:
vue-virtual-scroller、vue3-virtual-scroller。
- 原理:計(jì)算可視區(qū)域高度、每項(xiàng)高度,確定需要渲染的起始和結(jié)束索引,通過
Vue 項(xiàng)目中如何集成 PWA(漸進(jìn)式 Web 應(yīng)用)?
解析:- 使用 Vue CLI 的 PWA 插件:
@vue/cli-plugin-pwa,自動(dòng)生成service-worker.js。 - 配置
manifest.json:定義應(yīng)用名稱、圖標(biāo)、啟動(dòng)頁等。 - 實(shí)現(xiàn)功能:離線訪問、添加到桌面、推送通知(需后端支持)。
優(yōu)勢:提升用戶體驗(yàn),類似原生應(yīng)用,支持離線使用。
- 使用 Vue CLI 的 PWA 插件:
Vue 中的 “依賴注入”(
provide/inject)適用于哪些場景?
解析:適用于跨多級組件通信(如祖父→孫子),避免 “props drilling”(層層傳遞 props)。
典型場景:- 主題配置(全局主題傳遞給深層組件)。
- 權(quán)限信息(用戶權(quán)限傳遞給各功能組件)。
- 插件配置(如 UI 庫的全局配置傳遞給內(nèi)部組件)。
注意:不適合頻繁變化的數(shù)據(jù)(需手動(dòng)處理響應(yīng)式),復(fù)雜場景建議用 Vuex。
Vue3 的
reactivity模塊如何單獨(dú)使用?
解析:Vue3 的響應(yīng)式系統(tǒng)可獨(dú)立于 Vue 實(shí)例使用,適合非 Vue 項(xiàng)目或庫開發(fā)。import { reactive, effect } from 'vue' const state = reactive({ count: 0 }) effect(() => { // 副作用函數(shù),狀態(tài)變化時(shí)自動(dòng)執(zhí)行 console.log(`count: ${state.count}`) }) state.count++ // 輸出 "count: 1"Vue 中如何實(shí)現(xiàn)圖片預(yù)覽功能?
解析:- 點(diǎn)擊圖片時(shí),用
el-dialog(Element UI)或自定義彈窗展示大圖。 - 利用
FileReader預(yù)覽本地選擇的圖片(input type="file")。 - 插件:
vue-preview或viewer.js,支持縮放、旋轉(zhuǎn)、切換等功能。
- 點(diǎn)擊圖片時(shí),用
Vue 項(xiàng)目中如何處理錯(cuò)誤邊界(Error Boundary)?
解析:Vue2 中無官方錯(cuò)誤邊界,但可通過errorCaptured鉤子捕獲子組件錯(cuò)誤:export default { errorCaptured(err, vm, info) { console.error('捕獲錯(cuò)誤:', err, info); return false; // 阻止錯(cuò)誤向上傳播 } }Vue3 中可通過
onErrorCaptured鉤子實(shí)現(xiàn)類似功能,或使用第三方庫(如vue-error-boundary)。未來 Vue 的發(fā)展趨勢是什么?
解析:
- 更好的 TypeScript 集成:Vue3 已大幅提升類型支持,未來會(huì)進(jìn)一步優(yōu)化。
- 編譯時(shí)優(yōu)化:通過靜態(tài)分析提升性能(如 Vue3 的
compile-time特性)。 - 服務(wù)器組件:借鑒 React Server Components,提升首屏性能和 SEO。
- 生態(tài)完善:Vite、Pinia、Vue Router 等工具鏈持續(xù)優(yōu)化,降低開發(fā)成本。
- 跨平臺能力:加強(qiáng)與移動(dòng)端(如 Ionic、NativeScript)和桌面端(如 Electron)的集成。
以上題目覆蓋了 Vue 的核心原理、生態(tài)工具、性能優(yōu)化等高級知識點(diǎn),建議結(jié)合實(shí)際項(xiàng)目理解和實(shí)踐,不僅要知其然,更要知其所以然。
總結(jié)
到此這篇關(guān)于適合中高級前端vue面試的100道題目及解析的文章就介紹到這了,更多相關(guān)前端vue面試題目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決vue打包后刷新頁面報(bào)錯(cuò):Unexpected token <
這篇文章主要介紹了解決vue打包后刷新頁面報(bào)錯(cuò):Unexpected token <相關(guān)知識點(diǎn),需要的朋友們參考下。2019-08-08
vue+el-table實(shí)現(xiàn)合并單元格
這篇文章主要為大家詳細(xì)介紹了vue+el-table實(shí)現(xiàn)合并單元格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
uniapp Vue3中如何解決web/H5網(wǎng)頁瀏覽器跨域的問題
存在跨域問題的原因是因?yàn)闉g覽器的同源策略,也就是說前端無法直接發(fā)起跨域請求,同源策略是一個(gè)基礎(chǔ)的安全策略,但是這也會(huì)給uniapp/Vue開發(fā)者在部署時(shí)帶來一定的麻煩,這篇文章主要介紹了在uniapp Vue3版本中如何解決web/H5網(wǎng)頁瀏覽器跨域的問題,需要的朋友可以參考下2024-06-06
Vue監(jiān)聽iframe加載失敗事件的三種實(shí)現(xiàn)方法
iframe 是一個(gè) HTML 標(biāo)簽,作用是文檔中的文檔,或者浮動(dòng)的框架(frame),iframe 元素會(huì)創(chuàng)建包含另外一個(gè)文檔的內(nèi)聯(lián)框架(即行內(nèi)框架),本文給大家介紹了Vue監(jiān)聽iframe加載失敗事件的幾種實(shí)現(xiàn)方法,需要的朋友可以參考下2025-06-06
vue.js項(xiàng)目使用原生js實(shí)現(xiàn)移動(dòng)端的輪播圖
這篇文章主要為大家介紹了vue.js項(xiàng)目中使用原生js實(shí)現(xiàn)移動(dòng)端的輪播圖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

