大家好,我是小杨,一个和Vue相爱相杀6年的前端开发者。最近总有人问我:"现在学Vue3还是Vue2?"、"老项目要不要升级?"。今天我就用最直白的大白话,带大家彻底搞懂这两个版本的差异!
一、先看本质区别
用一句话概括:
- Vue2:Options API(选项式API)
- Vue3:Composition API(组合式API)+ Options API
就像做菜:
- Vue2是给你固定菜谱(data、methods分开放)
- Vue3是让你自由搭配食材(相关逻辑可以写在一起)
二、8个最核心的差异
1. 代码组织方式
html
<!-- Vue2 -->
<script>
export default {
data() {
return { count: 0 }
},
methods: {
increment() {
this.count++
}
}
}
</script>
<!-- Vue3 -->
<script setup>
const count = ref(0)
const increment = () => count.value++
</script>
变化 :Vue3的<script setup>
让相关代码更集中
2. 响应式原理
js
// Vue2
data() {
return { user: { name: '小杨' } }
}
// 动态添加属性需要$set
this.$set(this.user, 'age', 28)
// Vue3
const user = reactive({ name: '小杨' })
user.age = 28 // 直接生效
升级:Vue3用Proxy替代Object.defineProperty,解决了数组/对象新增属性的响应问题
3. 生命周期
Vue2 | Vue3 | 变化 |
---|---|---|
beforeCreate | setup() | 被setup替代 |
created | setup() | 被setup替代 |
beforeMount | onBeforeMount | 改名+需要导入 |
mounted | onMounted | 改名+需要导入 |
注意:Vue3的生命周期需要从vue显式导入
4. 模板变化
html
<!-- Vue2只能单个根元素 -->
<template>
<div>
<header></header>
</div>
</template>
<!-- Vue3支持多根元素 -->
<template>
<header></header>
<main></main>
</template>
优化:再也不用被迫套一层div了!
5. v-model升级
html
<!-- Vue2 -->
<ChildComponent v-model="pageTitle" />
<!-- Vue3 -->
<ChildComponent v-model:title="pageTitle" />
改进:Vue3支持多个v-model绑定
6. 性能提升
- 打包体积:Vue3(22.5KB)比Vue2(20KB)更小
- 编译优化:Vue3的diff算法更智能
- Tree-shaking:没用到的API不会打包
7. TypeScript支持
Vue3用TS重写,对类型推断更友好:
ts
// Vue2需要额外装饰器
@Component
export default class MyComp extends Vue {}
// Vue3直接支持
defineComponent({
setup() {
// 完美类型推断
}
})
8. 新成员加入
Vue3新增这些好帮手:
ref
/reactive
:响应式数据computed
/watch
:计算属性与监听provide
/inject
:跨组件通信teleport
:传送门组件suspense
:异步组件加载状态
三、项目升级建议
适合升级的情况:
- 新项目直接上Vue3
- 老项目准备重构
- 需要更好的TS支持
- 追求性能极致
可以暂缓的情况:
- 稳定运行的旧项目
- 依赖的第三方库不支持Vue3
- 团队学习成本过高
四、我的踩坑经验
- 路由变化:
js
// Vue2
this.$router.push('/home')
// Vue3
import { useRouter } from 'vue-router'
const router = useRouter()
router.push('/home')
- 全局属性:
js
// Vue2
Vue.prototype.$myGlobal = 'hello'
// Vue3
app.config.globalProperties.$myGlobal = 'hello'
- 事件总线 :
Vue3移除了$on
/$off
,推荐用mitt库:
js
import mitt from 'mitt'
const emitter = mitt()
emitter.emit('myEvent')
五、总结对比表
特性 | Vue2 | Vue3 |
---|---|---|
API风格 | Options API | Composition API + Options API |
响应式原理 | Object.defineProperty | Proxy |
模板 | 单根节点 | 多根节点支持 |
打包体积 | 20KB | 22.5KB(但Tree-shaking更强) |
TS支持 | 需要装饰器 | 原生支持 |
六、学习建议
- 新手可以从Vue2入门,但尽快转向Vue3
- 重点掌握Composition API思想
- 官方文档是最好的学习资料
最后说句掏心窝的话:技术迭代是常态,不必焦虑学不完,但要保持学习的状态。我在刚接触Vue3时也痛苦过,但坚持下来后发现真香!
⭐ 写在最后
请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.
✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式
✅ 认为我部分代码过于老旧,可以提供新的API或最新语法
✅ 对于文章中部分内容不理解
✅ 解答我文章中一些疑问
✅ 认为某些交互,功能需要优化,发现BUG
✅ 想要添加新功能,对于整体的设计,外观有更好的建议
✅ 一起探讨技术加qq交流群:906392632
最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!