1. v-for 中为什么需要 key?

2. 组件的渲染和更新过程

3. 组件中 data 为什么必须是函数?

4. Vue 中事件绑定的原理

Vue 的事件绑定分为原生 DOM 事件和组件事件,处理方式不同:

 

类型 绑定方式 实现原理
原生 DOM 事件 @click="fn" 通过addEventListener绑定到真实 DOM 元素
组件事件 @custom="fn" 通过 Vue 自定义的$on/$emit实现(发布 - 订阅模式)

 

5. v-model 的实现原理及自定义方式

6. v-html 可能导致的问题

7. 父子组件生命周期的调用顺序

8. Vue 组件通信方式

Vue 组件通信遵循单向数据流原则(父→子可直接传递,子→父需通过事件),常见方式包括:

 

场景 方式 说明
父→子 props 父组件通过属性传递数据,子组件用props接收
子→父 $emit/$on 子组件触发事件传递数据,父组件监听处理
跨层级 Provide/Inject 祖先组件提供数据,后代组件注入使用(非响应式)
跨组件 Event Bus 通过全局 Vue 实例($bus)实现事件发布订阅
复杂应用 Vuex/Pinia 集中式状态管理,统一管理共享数据
父子直接访问 $parent/$children 直接获取组件实例(不推荐,耦合度高)
父子 DOM 访问 ref 父组件通过ref获取子组件实例或 DOM 元素
透传属性 / 事件 $attrs/$listeners 传递未被props接收的属性 / 事件到子组件

9. 如何抽离 Vue 中的相同逻辑?

使用Vue.mixin混入公共逻辑,实现代码复用:

 

10. 为什么使用异步组件?

11. 什么是作用域插槽?

12. keep-alive 的原理及用法

13. Vue 常见性能优化手段

14. Vue3.0 的主要改进

15. 实现 hash 路由和 history 路由

16. Vue-Router 的导航守卫

导航守卫用于控制路由跳转过程,完整流程如下:

 

  1. 触发导航,调用失活组件的beforeRouteLeave;
  2. 调用全局beforeEach;
  3. 调用重用组件的beforeRouteUpdate(2.2+);
  4. 调用路由配置中的beforeEnter;
  5. 解析异步路由组件;
  6. 调用激活组件的beforeRouteEnter;
  7. 调用全局beforeResolve(2.5+);
  8. 导航确认,调用全局afterEach;
  9. 触发 DOM 更新;
  10. 执行beforeRouteEnter中传给next的回调(组件实例创建后)。

17. Vuex 中 action 和 mutation 的区别

维度 mutation action
操作类型 同步操作 异步操作(如 API 请求)
数据修改 直接修改state(必须通过commit调用) 间接修改(通过dispatch调用,内部再commit mutation)
DevTools 支持 可追踪(记录每一次状态变化) 无法直接追踪状态变化,需通过 mutation
严格模式 异步修改会报错 无限制

18. Vuex 工作原理