vue2 和vue3 使用区别,完整使用区别示例对比汇总

以下是结合最新实践及官方文档整理的 Vue2 与 Vue3 完整使用区别对比,涵盖核心差异点及典型示例:

一、响应式系统本质差异

1. 底层实现机制
版本实现方式特点局限
Vue2Object.defineProperty仅能劫持已存在的属性❌新增属性/删除属性无响应式
❌数组索引直接修改需特殊处理
Vue3Proxy + Reflect代理整个对象,支持动态属性增减、数组索引直接修改✅自动追踪所有属性变化

示例对比

// Vue2: 动态添加属性不触发视图更新
this.someObject.newProp = 'value'; // 无效!
// 解决方案:Vue.set(this.someObject, 'newProp', 'value');

// Vue3: 直接赋值即可触发更新
const state = reactive({ count: 0 });
state.newProperty = 'value'; // ✅自动触发视图更新

二、API 设计风格演变

1. Options API(Vue2 主流) vs Composition API(Vue3 推荐)
特性Vue2 Options APIVue3 Composition API
代码组织方式按功能模块划分(data/methods/computed)按业务逻辑聚合
数据访问this.xxxref().value / reactive().xxx
复用性依赖 Mixin 易产生命名冲突自定义 Hook(如 useCounter)可灵活复用
TypeScript 支持需额外配置原生支持,类型推导完善

完整示例对比

<!-- Vue2 计数器组件 -->
export default {
  data() { return { count: 0 } },
  methods: {
    increment() { this.count++ }
  },
  computed: {
    doubleCount() { return this.count * 2 }
  },
  watch: {
    count(newVal) { console.log('Count changed:', newVal) }
  }
}

<!-- Vue3 组合式写法 -->
<script setup>
import { ref, computed, watch } from 'vue'
const count = ref(0)
const increment = () => count.value++
const doubleCount = computed(() => count.value * 2)
watch(count, (newVal) => console.log('Count changed:', newVal))
</script>

三、生命周期钩子重构

生命周期阶段Vue2 钩子名称Vue3 钩子名称说明
创建前beforeCreate-➡️ 逻辑移至 setup()
创建后created-➡️ 逻辑移至 setup()
挂载前beforeMountonBeforeMount需显式导入
挂载后mountedonMounted需显式导入
卸载前beforeDestroyonBeforeUnmount语义更准确
卸载后destroyedonUnmounted语义更准确

迁移示例

// Vue2 生命周期
export default {
  created() { /* ... */ },
  mounted() { /* ... */ },
  beforeDestroy() { /* ... */ }
}

// Vue3 生命周期
import { onMounted, onBeforeUnmount } from 'vue'
export default {
  setup() {
    onMounted(() => { /* 挂载后逻辑 */ })
    onBeforeUnmount(() => { /* 卸载前清理 */ })
  }
}

四、模板语法增强

1. 多根节点支持
<!-- Vue2: 必须包裹单一根元素 -->
<template>
  <div>
    <header></header>
    <main></main>
    <footer></footer>
  </div>
</template>

<!-- Vue3: 支持多根节点(Fragment) -->
<template>
  <header></header>
  <main></main>
  <footer></footer>
</template>
2. 新增实用指令
指令功能说明Vue2 替代方案
v-memo缓存模板片段,依赖不变时跳过重新渲染手动实现计算属性
Teleport将组件内容渲染到指定 DOM 节点(如 body)需手动操作 DOM

Teleport 示例

<!-- Vue3 弹窗组件 -->
<teleport to="body">
  <div class="modal">...</div>
</teleport>

五、其他关键差异

1. TypeScript 支持
  • Vue2:需配合 vue-class-component 装饰器,类型推导有限
  • Vue3:原生支持,ref/reactive 提供完整类型推断

示例

// Vue3 TS 组件
const count = ref<number>(0); // ✅自动推导类型
const user = reactive({ name: 'John' }); // ✅对象类型推导
2. 性能优化
优化策略Vue2Vue3
静态节点处理基础静态分析🔧静态树提升(Static Tree Hoisting)
diff 算法全量对比📌补丁标志(Patch Flags)
包体积~20KB (gzipped)~10KB (gzipped) + Tree Shaking
3. 数组处理
  • Vue2:需重写数组方法(如 push/pop)才能触发响应式
  • Vue3:原生数组操作自动触发更新

示例

// Vue2: 需调用变异方法
this.$set(this.items, index, newValue);

// Vue3: 直接操作数组
items.push(newItem); // ✅自动触发更新

六、生态系统变化

生态组件Vue2 版本Vue3 版本备注
Routervue-router@2vue-router@4完全兼容 Vue3
Storevuex@2vuex@4支持 Composition API
UI 库Element UIElement Plus专为 Vue3 重构
构建工具Vue CLI 2Vite(默认)更快的冷启动和 HMR

七、实际场景选择建议

场景推荐版本原因
新项目开发Vue3✅更好的 TypeScript 支持
✅组合式 API 提升大型项目可维护性
旧项目升级分阶段迁移优先重构复杂组件为 Composition API,使用 @vue/compat 兼容运行
兼容性要求高Vue2支持 IE9+,适合企业内部旧系统改造
小型快速迭代Vue2简单轻便,学习曲线平缓

以上对比基于当前最新实践(2025年),建议新项目优先选择 Vue3 以获得更好的类型安全和长期维护性。完整迁移指南可参考Vue3 官方文档

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值