性能方面
- 响应式原理
- Vue2:使用
Object.defineProperty()
来实现数据响应式,对对象的每个属性进行劫持,在数据变化时通知视图更新。但它无法检测到对象属性的新增或删除,也不能很好地监听数组索引和长度的变化,需要使用特定的方法来触发更新。 - Vue3:采用
Proxy
对象来实现响应式,能够对整个对象进行代理,而不是单个属性,可监听对象属性的新增、删除以及数组的变化,性能和响应性更好。
- Vue2:使用
- 虚拟 DOM
- Vue2:虚拟 DOM 的更新算法在一些复杂场景下可能会有较多的不必要的对比和更新操作。
- Vue3:对虚拟 DOM 进行了优化,采用了更高效的
PatchFlags
标记,在更新时可以更精准地定位需要更新的节点,减少了不必要的比较和更新,提高了更新性能。
语法和 API 方面
- 组件选项
- Vue2:组件的选项定义比较分散,如
data
、methods
、computed
等都在同一级对象中定义。 - Vue3:引入了
setup
函数作为组件的入口点,将响应式数据、方法、计算属性等逻辑都集中在setup
函数中,使组件的逻辑更加清晰和紧凑。
- Vue2:组件的选项定义比较分散,如
- 生命周期钩子
- Vue2:有
beforeCreate
、created
、beforeMount
等一系列生命周期钩子函数。 - Vue3:虽然保留了大部分生命周期钩子的名称,但在
setup
函数中使用时需要通过onBeforeMount
、onMounted
等组合式 API 来使用,更加灵活和直观。
- Vue2:有
- 指令
- Vue2:常用指令有
v-if
、v-for
、v-bind
等。 - Vue3:基本指令与 Vue2 类似,但在一些细节上有所优化,例如
v-model
在 Vue3 中更加灵活,可以在自定义组件中更方便地使用。同时,新增了v-memo
指令,用于优化列表渲染性能。
- Vue2:常用指令有
功能特性方面
- Teleport
- Vue2:没有内置的
Teleport
功能,若要实现类似将组件渲染到指定 DOM 节点之外的其他位置的功能,需要借助第三方库或复杂的 DOM 操作。 - Vue3:新增了
Teleport
组件,允许将组件的内容渲染到指定的 DOM 节点中,而不受组件自身 DOM 结构的限制,在实现模态框、提示框等场景中非常有用。
- Vue2:没有内置的
- Suspense
- Vue2:没有原生的
Suspense
支持,处理异步组件加载时的状态管理相对复杂。 - Vue3:引入了
Suspense
组件,用于处理异步组件的加载状态,可以方便地实现加载动画、错误处理等功能,提升了用户体验。
- Vue2:没有原生的
开发体验方面
- TypeScript 支持
- Vue2:对 TypeScript 的支持相对有限,在使用 TypeScript 开发时可能会遇到一些类型推断不精准等问题。
- Vue3:在设计上更好地支持 TypeScript,提供了更完善的类型定义和类型推断,使 TypeScript 开发者能够获得更好的开发体验和代码可维护性。
- 构建工具集成
- Vue2:与构建工具的集成方式相对传统,如使用
vue-cli
进行项目搭建和管理。 - Vue3:与现代构建工具的集成更加紧密和高效,如
Vite
等,利用ES Module
的优势,实现了快速的冷启动和热更新,提升了开发效率。
- Vue2:与构建工具的集成方式相对传统,如使用