Vue 2 vs Vue 3 全面对比表
| 特性 | Vue 2 | Vue 3 | 主要变化 |
|---|---|---|---|
| 1. API 风格 | 选项式 API (Options API) | 组合式 API (Composition API) + 选项式 API | Vue 3 引入更灵活的组合式 API,同时保留选项式 API |
| 2. 响应式系统 | Object.defineProperty() | Proxy | 更高效,可检测数组索引和对象属性变化 |
| 3. 组件定义 | 选项对象 | setup 函数或 <script setup> | 更灵活的逻辑组织 |
| 4. 生命周期钩子 | 选项中定义 | 独立函数 (onMounted 等) | 可在 setup 中多次使用 |
| 5. 模板引用 | this.$refs | ref() | 更统一的 ref 概念 |
| 6. 异步组件 | Vue.component with async function | defineAsyncComponent | 更明确的异步组件定义 |
| 7. 组件事件 | this.$emit | defineEmits + emit 函数 | 更明确的事件声明和触发 |
| 8. 渲染函数 | render: h => h(‘div’) | import { h } | h 函数需要显式导入 |
| 9. 全局 API | Vue.use(), Vue.mixin() 等 | app.use(), app.mixin() 等 | 避免全局状态污染 |
| 10. 逻辑复用 | Mixins | 组合式函数 (Composables) | 更清晰、灵活的逻辑复用 |
| 11. TypeScript 支持 | 有限支持 | 全面支持 | 更好的类型推断和检查 |
| 12. 性能 | 较好 | 显著提升 | 更小的包体积,更快的渲染速度 |
| 13. 片段 (Fragments) | 不支持 | 支持 | 组件可以有多个根节点 |
| 14. Teleport | 不支持 | 支持 | 可将内容渲染到 DOM 树的其他部分 |
| 15. Suspense | 不支持 | 支持 | 更好地处理异步依赖 |
| 16. 多个 v-model | 不支持 | 支持 | 单个组件可使用多个 v-model |
| 17. 组合式 API 集成 | 不适用 | reactive, ref, computed, watch 等 | 提供更细粒度的响应式控制 |
| 18. 自定义渲染器 API | 有限支持 | 全面支持 | 更容易创建自定义渲染器 |
| 19. 静态树提升 | 有限 | 增强 | 更好的编译时优化 |
| 20. 基于 Proxy 的观察者机制 | 不支持 | 支持 | 提供更好的性能和功能 |
| 21. 模板编译优化 | 基本优化 | 显著增强 | 更高效的渲染,更小的生成代码 |
| 22. 虚拟 DOM | 基于对象的 VNode | 基于数组的 VNode | 更高效的 diff 算法 |
| 23. 响应式解构 | 不支持 | 支持 (通过 toRefs) | 更方便的响应式数据使用 |
| 24. 自定义指令 API | 使用对象 API | 使用钩子函数 API | 与组件生命周期保持一致 |
| 25. 过滤器 (Filters) | 支持 | 移除 | 推荐使用计算属性或方法替代 |
| 26. 功能性组件 | 需要指定 functional: true | 普通函数即可 | 简化功能性组件的创建 |
| 27. 异步错误处理 | Vue.config.errorHandler | app.config.errorHandler | 改进的错误捕获机制 |
| 28. 响应式 API | Vue.observable() | reactive() | 更强大的响应式 API |
| 29. 内置组件 | transition, keep-alive 等 | 新增 Teleport, Suspense | 增强的内置组件功能 |
| 30. 组件 data 选项 | 可以是对象或函数 | 必须是函数 | 避免数据共享导致的问题 |
| 31. Composition API RFC | 不适用 | 集成到核心 | 提供更好的逻辑组织和复用 |
| 32. 全局挂载点 | el 选项 | createApp().mount() | 更清晰的应用挂载过程 |
| 33. v-for 与 v-if 优先级 | v-for 高于 v-if | v-if 高于 v-for | 避免不必要的计算和渲染 |
| 34. 键盘事件别名 | .keyCodes 支持 | 移除 .keyCodes 支持 | 使用更标准的按键修饰符 |
| 35. 过渡类名 | v-enter, v-leave-to | v-enter-from, v-leave-to | 更一致的过渡类命名 |
全面的对比表涵盖了 Vue 2 和 Vue 3 之间的 35 个主要差异点。以下是一些重要变化的补充说明:
- API 风格:Vue 3 的组合式 API 提供了更灵活的代码组织方式,特别适合大型应用。
- 响应式系统:Vue 3 使用 Proxy,提供了更强大和高效的响应式系统。
- 组件定义:Vue 3 的
setup函数和<script setup>语法提供了更简洁的组件编写方式。 - 生命周期钩子:Vue 3 中的生命周期钩子作为独立函数使用,增加了灵活性。
- TypeScript 支持:Vue 3 提供了更好的 TypeScript 集成,改善了开发体验和类型安全。
- 新特性:Vue 3 引入了 Teleport、Suspense 等新特性,增强了框架的功能。
- 性能优化:Vue 3 在编译和运行时都进行了优化,提供了更好的性能。
- 模板编译优化:Vue 3 的编译器生成更高效的渲染代码。
- 组合式 API 集成:Vue 3 提供了一系列组合式 API(如 reactive, ref, computed, watch),使得状态管理更加灵活。
- 废弃特性:Vue 3 移除了过滤器(Filters),推荐使用计算属性或方法替代。
这个全面的对比不仅涵盖了基本的 API 变化,还包括了新增特性、性能优化、编译优化等多个方面。它展示了 Vue 3 相对于 Vue 2 的显著改进,包括更好的性能、更灵活的 API、更强大的功能以及更好的 TypeScript 支持。
