目录
1. 响应式系统:从 defineProperty 到 Proxy(底层的质变)
2. 组合式 API(Composition API):代码组织方式的革命
一、Vue 2 核心特性
Vue 2 是一款轻量级、渐进式的前端框架。它的核心理念是:
-
响应式数据驱动:数据变化自动更新视图
-
组件化开发:页面由一个个独立可复用的组件拼装而成
-
易上手:API 设计直观,中文文档完善
Vue 2 的典型写法(Options API)
<script>
export default {
// 数据
data() {
return { count: 0 };
},
// 计算属性
computed: {
double() {
return this.count * 2;
}
},
// 方法
methods: {
increment() {
this.count++;
}
},
// 生命周期
mounted() {
console.log('组件已挂载');
}
};
</script>
这种按类型(data、methods、computed、mounted)组织代码的方式,叫 Options API。对于小型项目,它清晰直观;一旦项目变大,同一个功能的逻辑会散落在不同选项中,导致代码难以维护。
二、Vue 3 的核心升级
1. 响应式系统:从 defineProperty 到 Proxy(底层的质变)
Vue 2 使用 Object.defineProperty 劫持对象的属性,存在三个致命缺陷:
-
新增/删除属性无法被监听到 → 必须用
Vue.set/Vue.delete -
通过下标修改数组
arr[0] = x无法触发更新 -
初始化时递归遍历所有层级,深层对象性能损耗大
Vue 3 改用 Proxy 代理整个对象:
-
✅ 新增/删除属性自动响应
-
✅ 数组下标修改自动响应
-
✅ 采用惰性代理:只有访问到深层属性时才递归,性能更优
-
✅ 原生支持
Map、Set等集合类型
// Vue 2 写法
const obj = { name: 'Tom' };
Vue.set(obj, 'age', 18); // ❌ 新增属性必须用 set
// Vue 3 写法
const state = reactive({ name: 'Tom' });
state.age = 18; // ✅ 直接新增即可
delete state.name; // ✅ 直接删除即可
2. 组合式 API(Composition API):代码组织方式的革命
Vue 3 推出了 Composition API,允许开发者按逻辑功能(而非选项类型)组织代码。
对比示例:实现一个“搜索”功能
<!-- Vue 2:同一功能的逻辑分散在三处 -->
<script>
export default {
data() {
return { keyword: '', list: [], loading: false };
},
methods: {
async search() { /* ... */ }
},
watch: {
keyword(newVal) { this.search(); }
},
mounted() {
this.search();
}
};
</script>
<!-- Vue 3:同一功能的逻辑聚合在一起 -->
<script setup>
import { ref, watch, onMounted } from 'vue';
const keyword = ref('');
const list = ref([]);
const loading = ref(false);
const search = async () => { /* ... */ };
watch(keyword, search);
onMounted(search);
</script>
3. 逻辑复用的最佳方案
在 Vue 2 中复用逻辑主要靠 Mixins,但存在命名冲突和隐式依赖的问题(你不知道某个数据来自哪个 Mixin)。
Vue 3 的组合式 API 可以将一个完整功能封装成组合函数:
// useSearch.js —— 一个可复用的搜索逻辑
export function useSearch(api) {
const keyword = ref('');
const list = ref([]);
const loading = ref(false);
const search = async () => {
loading.value = true;
try {
list.value = await api(keyword.value);
} finally {
loading.value = false;
}
};
watch(keyword, search);
onMounted(search);
return { keyword, list, loading, search };
}
使用时只需一行:
<script setup>
const { keyword, list, loading } = useSearch(fetchUserList);
</script>
这种“搭积木”式的组合,让逻辑复用变得干净、透明、可追溯。
三、Vue 2 vs Vue 3:十项核心差异速查表
| 序号 | 对比项 | Vue 2 | Vue 3 |
|---|---|---|---|
| 1 | 响应式原理 | Object.defineProperty,无法监听增删属性 | Proxy,全场景响应式 |
| 2 | 代码组织方式 | Options API(按类型划分) | Composition API(按功能聚合) + Options API 仍兼容 |
| 3 | 根组件模板 | 必须只有一个根标签 | 支持多个根标签(Fragment) |
| 4 | 全局 API | Vue.component() 污染全局 | app.component()隔离在应用实例中 |
| 5 | v-model | 每个组件只能绑定一个 | 支持多个:v-model:title、v-model:content |
| 6 | 生命周期 | beforeDestroy / destroyed | onBeforeUnmount / onUnmounted |
| 7 | this 指向 | Options API 中指向实例 | setup 中 没有 this |
| 8 | 事件总线 | $on / $off / $emit | 移除 $on/$off,推荐 mitt / pinia |
| 9 | 过滤器 filter | 支持 {{ msg | capitalize }} | 彻底移除, 推荐 computed 或全局方法 |
| 10 | TypeScript 支持 | 需要装饰器,支持较弱 | 原生完美支持 |
四、性能与体积:数据说话
| 对比项 | Vue 2 | Vue 3 |
|---|---|---|
| 包体积(含 runtime) | ~30KB(gzip) | 减少约 40%(得益于 Tree-shaking) |
| 响应式初始化 | 全量递归遍历对象 | 惰性代理,按需递归 |
| 编译优化 | 基础模板编译 | 静态标记 + 缓存,更新时跳过静态节点 |
| 开发服务器启动 | Vue CLI(Webpack)需 5~30s | Vite 启动 < 500ms |
五、生态工具对比
| 工具 | Vue 2 | Vue 3 |
|---|---|---|
| 状态管理 | Vuex 3.x | Pinia(官方推荐,更轻量)或 Vuex 4.x |
| 路由 | Vue Router 3.x | Vue Router 4.x |
| 构建工具 | Vue CLI(Webpack) | Vite(官方推荐,极速冷启动) |
| 桌面端 | Electron-Vue | Electron + Vite |
六、面试加分话术
当被问到“Vue 2 和 Vue 3 有什么区别”时,不要零散地罗列 API,按这个层次回答,逻辑更清晰:
“Vue 3 不是 Vue 2 的简单升级,而是一次全面的架构重构。我主要从三个层面来理解:
第一,响应式底层重构:从
Object.defineProperty换成了Proxy,解决了属性增删和数组变更的痛点,同时通过惰性代理提升了深层对象的性能,这是最根本的变化。第二,开发范式升级:推出了 Composition API,让我们可以按逻辑功能(而非选项类型)组织代码,极大提升了复杂项目的可维护性和逻辑复用能力,告别了 Mixins 的隐式依赖问题。
第三,工程化体验优化:全局 API 改为
createApp实例化,避免了应用间污染;官方推荐 Vite 作为构建工具,开发服务器启动速度碾压 Webpack;TypeScript 支持也达到了原生级。在实际迁移中,最需要关注的是:
v-model支持了多个绑定、filter被移除、全局 API 的调用方式变了,以及组件现在支持多根节点。”
写在最后
| 场景 | 建议 |
|---|---|
| 新项目 | 直接用 Vue 3 + Vite + <script setup>,这是现在的主流方向 |
| 维护老项目 | Vue 2 稳定可用,无需强行升级 |
| 学习顺序 | 建议先学 Vue 2 理解基础,再学 Vue 3 理解演进,但也可直接上手 Vue 3(官方文档已默认 Vue 3) |
Vue 3 已经非常成熟,在响应式性能、开发体验、类型支持和生态工具上都全面超越了 Vue 2。如果你正在做技术选型,Vue 3 是毫无疑问的最优解。
(PS:本文由deepseek辅助生成)


9299

被折叠的 条评论
为什么被折叠?



