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 (异步组件边界处理)
    • ⚠️ 深度响应式转换(性能敏感场景)
相关推荐
Mintopia4 分钟前
🌱 AIGC 技术的轻量化趋势:Web 端“小而美”模型的崛起
前端·javascript·aigc
开发者小天12 分钟前
React中的useRef的用法
开发语言·前端·javascript·react.js
im_AMBER16 分钟前
React 11 登录页项目框架搭建
前端·学习·react.js·前端框架
Live&&learn18 分钟前
nvm切换node版本时,npm不跟着切换解决
前端·npm·node.js
xixixin_21 分钟前
【React】检测元素是否出现在用户视窗内
开发语言·前端·javascript·react.js
谢彦超oooo1 小时前
HTML5 与前端开发要点
前端·html·html5
IT_陈寒1 小时前
Vue 3响应式原理深度拆解:5个90%开发者不知道的Ref与Reactive底层实现差异
前端·人工智能·后端
睡前要喝豆奶粉2 小时前
在.NET Core Web Api中使用JWT并配置UserContext获取用户信息
前端·.netcore
前端加油站2 小时前
一份实用的Vue3技术栈代码评审指南
前端·vue.js
Jonathan Star8 小时前
沉浸式雨天海岸:用A-Frame打造WebXR互动场景
前端·javascript