本文详细讲解了VUE3相关的面试题,从基础到进阶到高级,分别都有涉及,希望对你有所帮助!
答案:
Object.defineProperty()
实现响应式,有一定局限性,如无法检测对象属性的添加和删除;Vue3 采用 Proxy
对象,能全面拦截对象操作,解决了上述问题。Teleport
(可将组件模板渲染到指定 DOM 位置)、Suspense
(处理异步组件加载状态)等新特性。答案:
npm init vite@latest my - vue3 - project -- --template vue
cd my - vue3 - project
npm install
npm run dev
vue create my - vue3 - project
在创建过程中,可选择 Vue3 预设。
ref
和 reactive
的区别和使用场景。答案:
ref
主要用于创建单个响应式数据,可用于基本数据类型和复杂数据类型。访问和修改 ref
定义的数据时,需要通过 .value
属性。reactive
用于创建响应式对象或数组,直接访问对象属性即可触发响应式更新。ref
适用于创建简单的响应式变量,如计数器、表单输入值等。reactive
适用于管理复杂的响应式状态,如对象或数组形式的状态数据。示例代码:
{{ count.value }}
{{ user.name }}
答案:
可将相关逻辑封装在一个函数中,然后在多个组件中复用该函数。以下是一个简单的计数器逻辑复用示例:
// useCounter.js
import { ref } from 'vue';
export const useCounter = () => {
const count = ref(0);
const increment = () => {
count.value++;
};
const decrement = () => {
count.value--;
};
return {
count,
increment,
decrement
};
};
在组件中使用:
{{ counter.count }}
Teleport
和 Suspense
的使用场景。答案:
Teleport
可以将其渲染到 body
元素下,避免受到父组件样式的影响。
Modal Title
Modal content...
Loading...
答案:
在 Vue3 中使用 Vue Router 4.x 版本,路由守卫的使用方式如下:
import { createRouter, createWebHistory } from 'vue - router';
import Home from './views/Home.vue';
import About from './views/About.vue';
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: About
}
];
const router = createRouter({
history: createWebHistory(),
routes
});
router.beforeEach((to, from, next) => {
// 进行验证逻辑
if (to.meta.requiresAuth &&!isAuthenticated()) {
next('/login');
} else {
next();
}
});
export default router;
const routes = [
{
path: '/dashboard',
name: 'Dashboard',
component: Dashboard,
beforeEnter: (to, from, next) => {
// 路由独享守卫逻辑
if (!isAdmin()) {
next('/');
} else {
next();
}
}
}
];
答案:
key
:在列表渲染时,为每个列表项提供唯一的 key
,帮助 Vue 更准确地识别元素,减少不必要的 DOM 操作。const routes = [
{
path: '/about',
name: 'About',
component: () => import('../views/About.vue')
}
];
defineAsyncComponent
进行异步加载。ref
和 reactive
,根据数据类型和使用场景选择合适的响应式创建方式。
组件缓存不活跃的组件实例,避免重复渲染,提高组件切换的性能。
答案:
import { defineStore } from 'pinia';
export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0
}),
actions: {
increment() {
this.count++;
}
},
getters: {
doubleCount() {
return this.count * 2;
}
}
});
在组件中使用:
{{ counterStore.count }}
{{ counterStore.doubleCount }}
答案:
setup
函数首先执行,它是组合式 API 的入口。在 setup
函数中,可以进行响应式数据的创建、生命周期钩子的注册等操作。setup
函数执行完成后,才会进入组件的其他生命周期阶段。
答案:
Vue3 的响应式系统基于 Proxy
对象实现。当使用 reactive
或 ref
创建响应式数据时,Vue 会创建一个 Proxy
代理对象。
reactive
:对于对象或数组,reactive
会创建一个 Proxy
代理,拦截对象的属性访问、赋值、删除等操作。当访问对象属性时,会触发 get
拦截器,进行依赖收集;当修改对象属性时,会触发 set
拦截器,通知所有依赖该属性的副作用函数进行更新。ref
:ref
内部会将基本数据类型包装成一个对象,同样使用 Proxy
进行代理。访问和修改 ref
的 .value
属性时,会触发相应的拦截器,实现响应式更新。effect
函数和 track
、trigger
函数完成的。effect
函数用于创建副作用函数,track
函数用于收集依赖,trigger
函数用于触发依赖更新。答案:
diff
算法比较新旧虚拟 DOM 树,找出差异部分。为了提高比较效率,Vue3 采用了静态提升、事件缓存等优化技术。diff
算法的结果,只对真实 DOM 中发生变化的部分进行更新,避免了全量更新带来的性能开销。setup
函数的作用和执行时机。答案:
setup
函数是组合式 API 的入口,用于组件的初始化和逻辑组合。在 setup
函数中,可以创建响应式数据、定义方法、注册生命周期钩子等。它返回的数据和方法可以在模板中使用。setup
函数在组件实例初始化之后,beforeCreate
钩子之前执行。此时组件的 data
和 methods
选项还未初始化,因此在 setup
函数中无法访问 this
。