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

123 阅读1分钟

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

一、架构层面的重大变化

1. 响应式系统重写

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

示例:

// 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普通函数方法定义
computedcomputed()计算属性
watchwatch()/watchEffect()侦听器
mountedonMounted()生命周期

示例:

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

编译结果对比:

// 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支持一般完善

类型定义示例:

// 定义组件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

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

六、生命周期变化

1. 生命周期对照表

Vue 2Vue 3 (Composition API)变化说明
beforeCreate不再需要(直接setup)被setup替代
created不再需要(直接setup)被setup替代
beforeMountonBeforeMount名称变更
mountedonMounted名称变更
beforeUpdateonBeforeUpdate名称变更
updatedonUpdated名称变更
beforeDestroyonBeforeUnmount更准确的命名
destroyedonUnmounted更准确的命名
errorCapturedonErrorCaptured名称变更
-onRenderTracked新增调试钩子
-onRenderTriggered新增调试钩子

七、其他重要改进

1. 全局API修改

Vue 2Vue 3
Vue.prototypeapp.config.globalProperties
Vue.directiveapp.directive
Vue.mixinapp.mixin
Vue.useapp.use
new Vue()createApp()

应用初始化对比:

// Vue 2
const app = new Vue({...})
app.$mount('#app')

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

2. 自定义渲染器API

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 (异步组件边界处理)
    • ⚠️ 深度响应式转换(性能敏感场景)