Vue2和Vue3的区别

我现在要总结一下Vue2和Vue3的区别。首先,我记得Vue3是最近才出来的,应该有一些比较大的变化吧。比如,可能是在性能方面有改进?或者API的变化?

 

对了,Vue3引入了Composition API,这个和Vue2的Options API有什么不同呢?Options API是把数据、方法、计算属性等分别放在不同的选项里,比如data、methods、computed这些。而Composition API好像是允许用函数的方式来组织代码,比如用setup函数,里面可以更灵活地组合逻辑,这样代码复用可能更方便。比如之前用mixins可能会有命名冲突,Composition API可能解决了这个问题。

 

然后,响应式系统的实现可能不一样。Vue2用的是Object.defineProperty来劫持对象的getter和setter,这样对于对象新增的属性,或者数组的一些变化可能需要用Vue.set或者数组的方法来触发更新。而Vue3用了Proxy来代替,Proxy可以监听到更多类型的变化,比如添加属性、删除属性,或者数组的索引修改、长度变化,这样应该能更好地支持响应式,不需要额外的API了。

 

还有,Vue3支持多个根节点,Vue2的模板里只能有一个根元素,而Vue3可以用多个根节点,这样写起来更方便,不需要外面再包一层div了。

 

生命周期钩子方面,可能有些变化。比如beforeCreate和created在Vue3中被setup替代了?其他的钩子可能名字变了,比如beforeMount变成onBeforeMount,用的时候需要导入?可能还有新的钩子函数,比如onRenderTracked和onRenderTriggered用于调试?

 

TypeScript的支持是不是更好?Vue3是用TypeScript重写的,所以对TS的支持更友好,而Vue2虽然能用TS,但可能需要用vue-class-component之类的库,集成起来没那么自然。

 

还有体积方面,Vue3可能更小,Tree-shaking的支持更好,这样打包的时候没用的模块会被去掉,减少最终文件的大小。

 

性能优化方面,Vue3可能有更好的编译优化,比如虚拟DOM的更新算法改进,静态节点提升,这样在更新时可以减少不必要的比较,提升渲染速度。比如标记静态节点,在diff的时候跳过它们。

 

还有全局API的修改,比如Vue2的全局配置如Vue.config.xxx,在Vue3中改成了createApp创建的实例来配置,这样可以避免多个Vue实例之间的配置污染。比如Vue.use在Vue3中是app.use。

 

还有组件的事件监听,Vue3里v-model的变化,比如可以绑定多个v-model,而Vue2每个组件只能有一个。还有自定义事件的时候,Vue3需要显式声明emits,而Vue2是通过在父组件里监听子组件触发的$emit事件,不需要声明。

 

另外,Vue3移除了过滤器(filters),推荐使用计算属性或者方法代替。还有,一些内置的指令可能有变化,比如v-if和v-for的优先级不同,Vue3里v-if的优先级更高,而Vue2里v-for的优先级更高。

 

碎片(Fragments)的支持,也就是多个根节点,之前说过。Teleport组件,可以传送DOM到其他位置,比如模态框放到body下。还有Suspense组件,用于异步组件的加载状态处理,这些新特性Vue3才有。

 

比如自定义渲染器API,或者更好的按需引入,不过这些可能需要再查证一下。总的来说,Vue3在性能、代码组织、TypeScript支持、新特性等方面都有较大的改进,而Vue2可能在维护旧项目时还会继续使用,但新项目可能更推荐Vue3。

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

1. 架构与响应式系统

  • Vue2:使用 Object.defineProperty 实现响应式,存在以下限制:

    • 无法检测对象属性的添加/删除,需通过 Vue.set/Vue.delete 处理。

    • 对数组的索引修改和长度变化无法直接监听,需使用数组变异方法(如 pushpop 等)。

  • Vue3:改用基于 Proxy 的响应式系统,支持更多数据类型的监听(如 Map、Set),无需特殊 API 即可检测属性增删和数组索引变化。

2. 组合式 API(Composition API)

  • Vue2:基于 Options API(选项式 API),逻辑分散在 datamethodscomputed 等选项中,复用逻辑需依赖 mixins(易导致命名冲突)。

  • Vue3:引入 Composition API(如 setup() 函数),允许按逻辑功能组织代码,通过函数(如 refreactivecomputed)灵活组合逻辑,提升代码复用性和可维护性。

3. 生命周期与钩子函数

  • Vue2:生命周期钩子如 beforeCreatecreatedmounted 等。

  • Vue3

    • beforeCreate 和 created 被 setup() 替代。

    • 钩子名称调整,如 beforeMount → onBeforeMountmounted → onMounted(需显式导入)。

    • 新增调试钩子(如 onRenderTrackedonRenderTriggered)。

4. 模板与语法改进

  • 多根节点支持:Vue3 允许模板包含多个根元素,无需外层包裹 <div>

  • v-model 升级:Vue3 支持组件绑定多个 v-model(如 v-model:title),替代 Vue2 的 .sync 修饰符。

  • v-if 与 v-for 优先级:Vue3 中 v-if 优先级高于 v-for(Vue2 相反)。

5. 性能优化

  • Tree-shaking:Vue3 支持按需引入模块,未使用的功能(如过渡组件)不会打包到最终产物。

  • 虚拟 DOM 优化

    • 编译时标记静态节点,跳过 diff 过程。

    • 动态属性缓存,减少重复渲染开销。

  • SSR 性能提升:静态内容直接作为字符串输出,减少服务端负载。

6. TypeScript 支持

  • Vue2:需依赖 vue-class-component 或 vue-property-decorator 实现类式组件,类型推导较弱。

  • Vue3:完全用 TypeScript 重写,提供更完善的类型推断和 IDE 支持。

7. 新特性与 API

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

  • Suspense:处理异步组件加载状态(如展示加载动画)。

  • Fragment/Teleport/Suspense:内置组件支持更灵活的结构。

8. 全局 API 调整

  • Vue2:全局配置通过 Vue.config 或 Vue. 静态方法(如 Vue.use())。

  • Vue3:使用 createApp() 创建应用实例,配置隔离(如 app.use()),避免污染全局环境。

9. 其他变化

  • 过滤器(Filters)移除:Vue3 废弃过滤器,推荐使用计算属性或方法。

  • 事件声明:Vue3 需通过 emits 选项显式声明组件触发的事件。

  • 自定义渲染器:提供更灵活的渲染能力(如 WebGL、Canvas)。


 

posted @ 2025-03-17 15:22  小二的黑豆  阅读(126)  评论(0)    收藏  举报