当前位置:首页 > 技术 > 正文内容

Vue.js 2与Vue.js 3的主要差异对比

访客 技术 2026年8月18日 1

共同特征

1. 响应式架构

  • 均采用"模板+响应式数据"的开发模式,界面会随数据变化自动刷新
  • 都具备双向数据绑定(v-model)、条件渲染(v-if/v-show)、循环渲染(v-for)等核心指令

2. 组件化架构

  • 都以组件作为基本构建单元,支持父组件向子组件传递数据(props)和子组件向父组件发送事件($emit)
  • 都可通过插槽(slot)机制实现内容分发和组件复用

3. 指令系统

  • Vue 2的内置指令(v-bindv-onv-modelv-showv-ifv-for等)在Vue 3中延续使用,仅在细节方面有所优化

4. 生命周期函数

  • 大部分生命周期钩子保持同名:created / mounted / updated / destroyed(Vue 3中调整为beforeUnmount / unmounted
  • 钩子的执行顺序和逻辑流程与Vue 2基本保持一致

关键差异对比

对比维度 Vue 2 Vue 3
核心技术实现 基于Object.defineProperty(getter/setter机制) 基于ES6 Proxy代理对象
响应式编程接口 datacomputedwatch 新增reactiverefcomputedwatch(组合式API)
组件编写风格 选项式API(datamethodscomputedwatch等) 同时支持选项式API和组合式API
运行性能 启动较慢、包体积较大,约33KB压缩后 启动更快、包体积更小,约23KB压缩后
按需打包支持 几乎不支持Tree-shaking 完全支持Tree-shaking,可实现按需导入
TypeScript集成 社区维护类型声明,集成体验有限 官方深度支持、源码使用TS编写,类型推断更完善
新增功能特性 Fragment、Teleport、Suspense、<script setup>
全局API调用方式 Vue.componentVue.directiveVue.mixin 迁移到app.componentapp.directive,通过createApp获取应用实例
销毁生命周期 beforeDestroydestroyed beforeUnmountunmounted(命名更具语义性)
v-model语法 单一语法(v-model="value" 支持多个v-model,语法调整为v-model:propName
异步组件处理 Vue.component('async', () => import(...)) 同样支持,但更便捷,并可配合Suspense处理加载状态

1. 响应式机制底层实现

  • Vue 2:利用Object.defineProperty拦截对象属性的getter/setter方法,实现依赖追踪和变更通知。对于动态添加或删除属性需要手动调用Vue.set / Vue.delete
  • Vue 3:采用ES6的Proxy代理对象,能够直接监控整个对象包括数组的增删改操作,无需额外的API辅助。性能表现更佳,内存占用更少。

2. API设计哲学:选项式vs组合式

选项式API(两种版本都支持)

export default {
  data() { 
    return { counter: 0 } 
  },
  computed: { 
    doubled() { 
      return this.counter * 2 
    } 
  },
  methods: { 
    increase() { 
      this.counter++ 
    } 
  },
  watch: { 
    counter(newValue) { 
      console.log(newValue) 
    } 
  }
}

组合式API(Vue 3新增)

import { ref, computed, watch } from 'vue'

export default {
  setup() {
    const counter = ref(0)
    const doubled = computed(() => counter.value * 2)
    
    function increase() { 
      counter.value++ 
    }
    
    watch(counter, (newValue) => {
      console.log(newValue)
    })
    
    return { counter, doubled, increase }
  }
}

优势:相关逻辑集中管理,代码结构更加"平面化",便于功能复用和单元测试。

3. 性能与包大小优化

Vue 3内部重构了虚拟DOM算法、模板编译器和响应式系统,大幅提升了渲染性能。原生支持Tree-shaking机制,使得生产环境的包体积更小、加载速度更快。

4. TypeScript深度集成

Vue 2的TypeScript支持主要依赖社区维护的vue-class-componentvue-property-decorator等工具,开发体验不够顺畅。Vue 3从内核层面进行设计,所有API都具备完整的类型定义,<script setup lang="ts">让组件编写更加简洁,类型推断更加准确。

5. 核心新功能特性

功能 描述
Fragment 组件可返回多个根节点,无需额外的包装元素
Teleport 将子组件渲染到DOM树的任意指定位置,常用于弹窗、通知等场景
Suspense 异步组件加载期间可显示占位内容,改善用户体验
<script setup> 单文件组件的简化语法,更简洁,自动推导setup()返回值

迁移策略与兼容性

1. 全局API调用方式变更

// Vue 2
Vue.component('CustomComponent', CustomComponent)

// Vue 3
import { createApp } from 'vue'
const application = createApp(App)
application.component('CustomComponent', CustomComponent)

2. 生命周期钩子命名调整

Vue 2 Vue 3
beforeCreate beforeCreate
created created
beforeMount beforeMount
mounted mounted
beforeUpdate beforeUpdate
updated updated
beforeDestroy beforeUnmount
destroyed unmounted

3. v-model语法改进

  • Vue 2仅支持对value属性进行双向绑定
  • Vue 3支持多个v-model绑定,并可绑定到自定义属性

4. 跨版本插件兼容

  • 大多数Vue 2插件在Vue 3环境下需要升级才能正常工作,Vue 3官方提供了兼容构建版本
  • 建议逐步将业务逻辑迁移到组合式API,然后再升级核心框架版本
标签: vuejsJavaScript

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。