Vue2与Vue3主要区别详解

首先,Vue3是在2020年发布的,而Vue2之前已经存在了挺长时间。我记得Vue3有一些大的变化,比如使用Proxy代替了Object.defineProperty来实现响应式系统。那Object.defineProperty有什么问题呢?可能是在监听数组变化或者对象新增属性的时候不太方便,需要用到Vue.set这样的方法,而Vue3的Proxy可以更好地处理这些情况,不需要额外的API。

 

然后是Composition API。Vue2主要是Options API,比如data、methods、computed这些选项分开写,而Vue3引入了Composition API,可以用setup函数来组织代码,逻辑更灵活,尤其是处理复杂组件的时候,可以按功能组织代码,而不是分散在各个选项中。比如可以用ref和reactive来声明响应式数据,用computed和watchEffect来处理副作用。

 

还有性能方面的改进。Vue3的虚拟DOM进行了优化,比如增加了静态树提升(hoist static),编译时标记动态节点,减少diff的比较次数。另外,Tree-shaking支持更好,打包体积更小,因为Vue3的模块可以按需引入,而Vue2的整个体积较大,即使没用的功能也会被打包进去。

 

生命周期方面,Vue3有些变化,比如beforeCreate和created被setup替代了,其他钩子名前加了on,比如mounted变成onMounted,而且需要在setup中使用。还有,Vue3删除了过滤器(filters),建议用计算属性或方法代替。

 

TypeScript的支持也是一个区别。Vue3是用TypeScript重写的,对TS的支持更好,而Vue2虽然能用TS,但需要借助vue-class-component之类的库,集成起来没那么自然。

 

另外,Vue3支持多个根节点,Fragment组件,而Vue2每个组件只能有一个根元素。这可能在布局时更方便,不需要多余的包裹元素。

 

还有Teleport组件,可以把内容渲染到DOM的其他位置,比如模态框,这在Vue2中可能需要自己处理,而Vue3内置了这个功能。Suspense组件用于处理异步组件的加载状态,这也是Vue3新增的特性。

 

自定义渲染器方面,Vue3允许自定义渲染逻辑,比如渲染到Canvas或原生应用,而Vue2在这方面可能不够灵活。

 

全局API的改变,Vue3使用createApp来创建应用实例,而Vue2是new Vue()。这种变化使得可以创建多个实例而不会互相影响,同时全局配置如Vue.use在Vue3中改为实例方法,比如app.use(),这样更模块化,避免污染全局。

 

还有,Vue3移除了事件总线(Event Bus),推荐使用provide/inject或者Vuex/Pinia这样的状态管理库。这可能是因为事件总线在大型应用中容易导致难以维护的问题。

 

总结一下,我需要从响应式系统、Composition API、性能优化、生命周期、TypeScript支持、新特性(Fragment、Teleport、Suspense)、打包体积、全局API变化、移除的过滤器、多个根节点等方面来比较两者的区别。可能还有更多细节,但这些都是主要的点。我需要确保每个点都正确,没有记错的地方。比如,关于Tree-shaking,Vue3确实更模块化,而Vue2的API是整体引入的。生命周期钩子的命名变化和setup函数的引入是否正确。还有,Teleport之前叫Portal,后来改名了,对吗?是的,在Vue3中叫做Teleport。

 

可能还需要提到,Vue3的代码库完全用TypeScript重写,所以对TS的支持更好。而Vue2原本是用Flow类型系统,后来才加入TS支持,但不如Vue3原生。

 

另外,关于性能优化方面,Vue3的响应式系统更高效,尤其是处理大型对象或数组时,Proxy的性能可能更好,同时避免了Vue2中需要$set的限制。

 

最后,应该举一些例子,比如Composition API的使用方式,或者setup函数的代码结构,但可能不需要太深入,只要说明区别即可。

Vue2 和 Vue3 的主要区别体现在以下几个方面:

1. 响应式系统

  • Vue2:使用 Object.defineProperty 实现数据劫持。

    • 缺点:无法检测对象属性的动态添加或删除(需用 Vue.set/Vue.delete),对数组的某些操作(如通过索引修改元素)需特殊处理。

  • Vue3:改用 Proxy 实现响应式。

    • 优势:直接监听对象和数组的变化,无需特殊 API,性能更好,支持动态增删属性。


2. Composition API

  • Vue2:基于 Options APIdatamethodscomputed 等选项分离)。

  • Vue3:新增 Composition APIsetup 函数 + ref/reactive)。

    • 优势:逻辑按功能组织,代码复用更灵活(如自定义 Hook),适合复杂组件。

    • // Vue3 Composition API 示例
      import { ref, computed } from 'vue';
      export default {
        setup() {
          const count = ref(0);
          const double = computed(() => count.value * 2);
          return { count, double };
        }
      }
    • 3. 性能优化

      • 虚拟 DOM 优化

        • Vue3 引入 静态树提升(标记静态节点,减少 diff 比较)和 补丁标记(动态节点直接追踪)。

      • Tree-shaking

        • Vue3 模块按需引入,打包体积更小(如未使用 Transition 组件,则不会包含其代码)。


      4. 生命周期

      • Vue2beforeCreatecreatedmounted 等。

      • Vue3

        • beforeCreate → 使用 setup() 替代。

        • 其他钩子名前加 on(如 onMounted),需在 setup 中调用。

        • 移除 beforeDestroy,改为 onBeforeUnmount


      5. TypeScript 支持

      • Vue3:完全用 TypeScript 重写,提供更好的类型推断和开发体验。

      • Vue2:需借助 vue-class-component 或 vue-property-decorator,原生支持较弱。


      6. 新特性

      • Fragment:支持多根节点组件,无需外层包裹元素。

      • Teleport:将组件内容渲染到 DOM 任意位置(如模态框)。

      • Suspense:处理异步组件加载状态(显示占位内容)。

      • 自定义渲染器:允许渲染到非 DOM 环境(如 Canvas、Native)。


      7. 全局 API 变更

      • Vue2:通过 new Vue() 创建实例,全局配置(如 Vue.use())影响所有实例。

      • Vue3

        • 使用 createApp() 创建隔离的应用实例。

        • 全局 API 改为实例方法(如 app.component()app.use())。


      8. 其他变化

      • 移除过滤器(Filters):推荐用计算属性或方法替代。

      • 事件总线(Event Bus)弃用:推荐使用 provide/inject 或状态管理库(如 Pinia)。

      • v-model 增强:支持多个 v-model 绑定(如 v-model:title)。


      总结

       Vue2Vue3
      响应式 Object.defineProperty Proxy
      API 风格 Options API Composition API + Options API
      TS 支持 需插件 原生支持
      性能 较慢 虚拟 DOM 优化 + Tree-shaking
      新特性 - Fragment, Teleport, Suspense

      Vue3 通过底层优化和新特性提升了开发体验和性能,同时保持向下兼容,适合新项目和渐进式升级

posted @   小二的黑豆  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示