Vue 2 与 Vue 3 的核心区别及 Vue 3 新特性详解

Vue 2 与 Vue 3 的核心区别及 Vue 3 新特性详解

一、架构层面的重大变化

1. 响应式系统重写

Vue 2 (Object.defineProperty) Vue 3 (Proxy)
检测原理 递归遍历对象属性逐个劫持 代理整个对象
数组支持 需要特殊处理数组方法 原生支持
性能影响 初始化时递归性能消耗大 按需代理
新增属性 需要Vue.set 直接响应

示例:

javascript 复制代码
// Vue 2
this.$set(this.obj, 'newProp', value)

// Vue 3
this.obj.newProp = value // 自动响应

二、Composition API(组合式API)

1. 核心函数对比

选项式API (Vue2) 组合式API (Vue3) 作用
data() ref()/reactive() 响应式数据
methods 普通函数 方法定义
computed computed() 计算属性
watch watch()/watchEffect() 侦听器
mounted onMounted() 生命周期

示例:

javascript 复制代码
// Vue 2
export default {
  data() {
    return { count: 0 }
  },
  methods: {
    increment() {
      this.count++
    }
  }
}

// Vue 3
import { ref } from 'vue'
export default {
  setup() {
    const count = ref(0)
    const increment = () => count.value++
    return { count, increment }
  }
}

三、性能优化提升

1. 编译时优化

优化点 Vue 2 Vue 3
虚拟DOM 全量比较 静态标记(PatchFlag)
静态提升 静态节点提升到render函数外部
事件缓存 缓存事件处理函数
Tree-shaking 支持有限 按需引入核心功能

编译结果对比:

javascript 复制代码
// Vue 2生成的渲染函数
function render() {
  with(this) {
    return _c('div', [_v("Hello "+_s(name))])
  }
}

// Vue 3生成的渲染函数
import { createVNode as _createVNode } from "vue"
const _hoisted_1 = /*#__PURE__*/_createVNode("div", null, "static content", -1 /* HOISTED */)

function render() {
  return (_openBlock(), _createBlock("div", null, [
    _hoisted_1,
    _createVNode("p", null, _toDisplayString(_ctx.name), 1 /* TEXT */)
  ]))
}

四、TypeScript支持

1. 类型系统改进

特性 Vue 2支持度 Vue 3支持度
组件Props类型 有限 完整
模板类型检查 实验性支持
Composition API 完整类型
JSX支持 一般 完善

类型定义示例:

typescript 复制代码
// 定义组件Props类型
interface Props {
  title: string
  count?: number
}

// 使用泛型定义组件
defineComponent<Props>({
  props: {
    title: String,
    count: Number
  },
  setup(props) {
    // props自动推断类型
    const doubled = computed(() => props.count * 2)
    return { doubled }
  }
})

五、新组件和API

1. 新增内置组件

组件 作用 替代方案(Vue2)
<Teleport> 传送组件到DOM其他位置 portal-vue库
<Suspense> 异步组件加载状态管理 自行实现
<Fragment> 多根节点组件 必须单根节点

2. 新响应式API

javascript 复制代码
import { 
  ref,         // 基本类型响应式
  reactive,    // 对象响应式
  computed,    // 计算属性
  watch,       // 侦听器
  watchEffect, // 自动依赖收集的侦听
  readonly,    // 只读代理
  shallowRef,  // 浅层ref
  toRef,       // 保持响应式连接
  toRefs       // 解构保持响应式
} from 'vue'

六、生命周期变化

1. 生命周期对照表

Vue 2 Vue 3 (Composition API) 变化说明
beforeCreate 不再需要(直接setup) 被setup替代
created 不再需要(直接setup) 被setup替代
beforeMount onBeforeMount 名称变更
mounted onMounted 名称变更
beforeUpdate onBeforeUpdate 名称变更
updated onUpdated 名称变更
beforeDestroy onBeforeUnmount 更准确的命名
destroyed onUnmounted 更准确的命名
errorCaptured onErrorCaptured 名称变更
- onRenderTracked 新增调试钩子
- onRenderTriggered 新增调试钩子

七、其他重要改进

1. 全局API修改

Vue 2 Vue 3
Vue.prototype app.config.globalProperties
Vue.directive app.directive
Vue.mixin app.mixin
Vue.use app.use
new Vue() createApp()

应用初始化对比:

javascript 复制代码
// Vue 2
const app = new Vue({...})
app.$mount('#app')

// Vue 3
import { createApp } from 'vue'
const app = createApp({...})
app.mount('#app')

2. 自定义渲染器API

javascript 复制代码
import { createRenderer } from '@vue/runtime-core'

const { render, createApp } = createRenderer({
  // 自定义节点操作
  insert: (child, parent) => {
    // 非DOM环境的渲染逻辑
  }
})

八、迁移建议

  1. 渐进式迁移

    • 使用@vue/compat构建兼容版本
    • 逐步替换废弃API
  2. 优先采用的新特性

    • ✅ Composition API (复杂逻辑组织)
    • <script setup>语法糖
    • ✅ 更灵活的组件(多根节点)
    • ✅ Teleport组件(模态框/弹窗)
  3. 需要谨慎使用的特性

    • ⚠️ Fragments (可能影响样式作用域)
    • ⚠️ Suspense (异步组件边界处理)
    • ⚠️ 深度响应式转换(性能敏感场景)
相关推荐
崔庆才丨静觅16 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606116 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了16 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅16 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅17 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅17 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment17 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅18 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊18 小时前
jwt介绍
前端
爱敲代码的小鱼18 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax