面试题答案
一键面试1. 代码组织优势
- 逻辑复用与解耦:
- Options API情况:在Vue 2的Options API中,当多个组件需要复用相同逻辑时,通常使用mixin。例如在一个电商项目中,商品列表组件和商品详情组件都需要获取商品数据的逻辑。使用mixin会将该逻辑混入到多个组件中,但是mixin的逻辑容易造成变量和方法命名冲突,并且难以追踪其来源。例如在一个管理系统项目中,有用户列表组件和角色列表组件都需要权限控制逻辑,使用mixin混入权限判断方法和数据后,当组件逻辑复杂时,很难分清哪些是组件自身的逻辑,哪些是混入的逻辑。
- Composition API情况:Vue 3的Composition API通过自定义Hook函数实现逻辑复用。以电商项目为例,可以创建一个
useProduct
的Hook函数,将获取商品数据的逻辑封装在其中。不同组件只需引入这个Hook函数并调用,就可复用逻辑,且变量和方法都在Hook函数内部管理,避免了命名冲突。在管理系统项目中,创建usePermission
Hook函数来管理权限控制逻辑,各组件使用时直接引入调用,逻辑清晰且解耦。
- 代码可读性与维护性:
- Options API情况:在Options API中,组件逻辑按选项分类,如
data
、methods
、computed
等。随着项目规模增大,组件逻辑变得复杂,不同逻辑关注点会分散在各个选项中。例如在一个大型的博客系统项目中,文章编辑组件既要处理文章内容的data
,又要在methods
中处理保存文章、验证文章格式等逻辑,这些逻辑分散在不同选项中,当需要修改文章保存逻辑时,可能需要在methods
中翻找,并且与data
的关联也不直观。 - Composition API情况:Composition API以逻辑功能为单位组织代码。在博客系统的文章编辑组件中,可以将文章内容相关的
reactive
数据和处理文章保存、验证等相关方法放在一个逻辑块中。例如使用setup
函数,通过reactive
定义文章内容数据,然后在同一函数中定义处理这些数据的方法,逻辑关联性强,提高了代码的可读性和维护性,修改保存逻辑时可以直接在相关逻辑块中找到。
- Options API情况:在Options API中,组件逻辑按选项分类,如
2. 性能优化优势
- 响应式系统优化:
- Options API情况:Vue 2的响应式系统基于Object.defineProperty,它对对象的属性进行劫持。在大型项目中,如果对象嵌套层级过深,或者数据量非常大时,性能会受到影响。例如在一个地图项目中,地图数据可能是一个非常复杂且嵌套多层的对象,Vue 2在监听这些数据变化时,需要递归遍历对象的每一层属性,性能开销较大。
- Composition API情况:Vue 3的Composition API使用Proxy实现响应式系统。Proxy是对整个对象进行代理,而非对每个属性逐一劫持。在地图项目中,使用Composition API的
reactive
创建响应式地图数据时,Proxy能够更高效地监听数据变化,尤其是对于复杂嵌套对象,不需要递归深度监听,从而提升了性能。
- 按需加载与代码分割:
- Options API情况:在Vue 2中,组件的逻辑都写在组件内部,很难做到按需加载特定的逻辑部分。例如在一个多功能的报表组件中,可能包含图表生成、数据导出等多种功能,在某些场景下只需要图表生成功能,但整个组件的代码都会被加载。
- Composition API情况:通过将逻辑封装成Hook函数,可以很方便地实现按需加载。在报表组件中,可以将图表生成逻辑封装成
useChart
Hook函数,数据导出逻辑封装成useExport
Hook函数。在只需要图表生成功能的场景下,只引入useChart
Hook函数,减少了不必要的代码加载,提升了项目性能。
3. 利用Composition API提升项目性能的方法
- 合理使用ref和reactive:在项目中,对于简单数据使用
ref
,复杂对象使用reactive
。例如在一个计数器组件中,计数器的值使用ref
定义即可。而在一个包含用户信息、订单信息等复杂数据结构的组件中,使用reactive
定义响应式数据,这样可以利用Vue 3响应式系统的优势,提高性能。 - 使用watchEffect和watch的正确时机:
- watchEffect:适用于立即执行并且响应式追踪依赖的副作用操作。例如在一个实时更新的仪表盘组件中,数据变化时需要立即重新计算一些指标并更新视图,就可以使用
watchEffect
。 - watch:适用于更加细粒度地控制数据变化的监听。例如在一个用户登录状态管理组件中,只在用户登录状态发生变化时执行特定逻辑,就可以使用
watch
来监听登录状态的变化,避免不必要的计算,提升性能。
- watchEffect:适用于立即执行并且响应式追踪依赖的副作用操作。例如在一个实时更新的仪表盘组件中,数据变化时需要立即重新计算一些指标并更新视图,就可以使用
- 优化组件的setup函数:在
setup
函数中,避免进行过多的复杂计算和不必要的副作用操作。例如在一个商品列表组件的setup
函数中,只进行数据的初始化和逻辑的准备工作,将复杂的数据处理逻辑封装成单独的函数在需要时调用,而不是在setup
函数中直接执行,这样可以确保组件初始化性能。