整体区别
- 使用proxy代替defineProperty实现数据相应式
- vue3支持多个根元素
- 更好的ts支持
- 体积比vue2更小,性能提升,运行速度更快
- diff算法优化,vue2中的虚拟dom是全量的对比,vue3新增了静态标记(patchflag),与上次虚拟节点对比时,只对比带有(patchflag)标记的节点(动态数据所在的节点),以减少非动态数据的比对时的性能消耗。
- 静态提升,vue2无论元素是否参与更新,每次都会重新创建然后再渲染。vue3对于不参与更新的元素,会做静态提升(提升到render函数之外),只会被创建一次,在渲染时直接复用即可。
- 组合式api将逻辑代码集中,便于维护
组合式 API的优点
- 更好的逻辑复用:用组合函数代替mixins
- 更灵活的代码组织:v2造成相同的逻辑关注点拆分在不同的选项中,v3则将同一个逻辑关注点相关的代码被归为了一组
- 更好的类型推导:大多数时候,用 TypeScript 书写的组合式 API 代码和用 JavaScript 写都差不太多!
- 更小的生产包体积:不依赖this,对代码压缩友好
vue2.x与vue3.x语法区别
- v-for的优先级在v2高于v-if,v3则相反
- v-directive钩子函数不同,v3类似生命周期钩子,v2是bind、inserted等
- v-model在组件上的展开形式不同,vue2为:value=xxx和@input=xxx,vue3为:modelValue=xxx和@update:modelValue=xxx,组件可以绑定多个v-model,可以传参,可以自定义修饰符
- v3增加computed和watch调试功能:onTrack和onTrigger
- vue3的监听对象,watch默认是深度监听,vue2则不是
- vue3中模板中的组件名可以使用大驼峰
- 默认关闭实例引用(通过组件ref访问$parent),必须手动暴露出去
- vue3已不推荐使用mixins,用组合式函数代替,缺点,来源不明,命名空间冲突,隐式的跨mixin交流
- vue3新增卸载钩子,去除销毁钩子
- vue2,tbody包裹子组件使用<tr is=“child-son”></tr>,vue3使用<tr is=“vue:child-son”></tr>,is 的值必须加上前缀 vue: 才可以被解析为一个 Vue 组件
- 移除.sync,使用v-model:name='username'模式代替
- 移除.native修饰符,直接在组件上绑定事件即可(继承事件),如果要监听子组件的emit事件,需要先声明emit选项
- 移除$listeners,事件包含在$attrs中,多节点时必须显示绑定在某个元素
router3.x与router4.x
- 移除filter过滤器选项
- 3.x通过mode字段设置hash还是history模式,4.x通过history字段设置。
- 在4.x中routes 数组的顺序并不重要!,3.x则规定含有通配符的路由应该放在最后。
- 3.x transition包裹router-view,4.x router-view包裹transition
- 4.x新增动态路由
vuex3 与 vuex4.x
- 新增useStore方法来访问store
Vuex vs. Pinia
- mutation 已被弃用
- 不再有嵌套结构的模块
- 不再有可命名的模块
- 可以重置state