【前端框架】vue2和vue3的区别详细介绍

在这里插入图片描述

Vue 3 作为 Vue 2 的迭代版本,在性能、语法、架构设计等多个维度均有显著的变革与优化。以下详细剖析二者的区别:

响应式系统

Vue 2
  • 实现原理:基于 Object.defineProperty() 方法实现响应式。当一个 Vue 实例创建时,Vue 会遍历 data 选项中的所有属性,使用 Object.defineProperty() 将这些属性转换为 getter/setter。这样,当这些属性的值发生变化时,Vue 能够检测到并更新与之绑定的 DOM。
  • 局限性
    • 无法检测对象属性的添加和删除:由于 Object.defineProperty() 是对已有属性进行劫持,因此当给对象添加新属性或删除已有属性时,Vue 2 无法自动追踪这些变化。开发者需要使用 Vue.set()this.$set() 方法来手动触发响应式更新。
    • 数组变更检测问题:Vue 2 对数组的某些方法(如 push()pop()splice() 等)进行了拦截,可以检测到这些操作并更新视图。但对于通过索引直接修改数组元素或修改数组长度的操作,Vue 2 无法自动触发响应式更新。
Vue 3
  • 实现原理:采用 Proxy 对象实现响应式系统。Proxy 可以劫持整个对象,能够拦截对象的各种操作,包括属性的访问、赋值、删除等,从而实现更全面的响应式追踪。
  • 优势
    • 解决属性添加和删除的检测问题:使用 Proxy 可以自动检测对象属性的添加和删除,无需像 Vue 2 那样使用额外的方法来触发响应式更新。
    • 数组操作的完整响应式:对于数组的任何操作,Proxy 都能进行拦截,确保数组的变化能够被及时检测到并更新视图。

语法和 API

选项式 API(Options API)与组合式 API(Composition API)
  • Vue 2:主要使用选项式 API,组件逻辑通过不同的选项(如 datamethodscomputedwatch 等)来组织。当组件变得复杂时,相关逻辑会分散在不同的选项中,导致代码难以阅读和维护。例如,一个组件中可能同时包含数据获取、表单验证、事件处理等多种逻辑,这些逻辑会被分散在不同的选项里,使得代码的关联性和复用性较差。
  • Vue 3:引入了组合式 API,允许开发者根据逻辑功能来组织代码。开发者可以将相关的逻辑封装在一个函数中,然后在 setup 函数中调用这些函数,提高了代码的复用性和可维护性。例如,将数据获取逻辑封装在一个 useDataFetching 函数中,在多个组件中都可以复用这个函数。同时,Vue 3 也保留了选项式 API,以兼容旧项目。
生命周期钩子
  • Vue 2:具有多个生命周期钩子,如 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed 等。这些钩子在组件的不同阶段被调用,开发者可以在这些钩子中执行特定的操作。
  • Vue 3:对生命周期钩子进行了重命名,并且可以在组合式 API 中使用新的方式来调用。beforeCreatecreated 可以在 setup 函数中实现,beforeDestroy 改为 beforeUnmountdestroyed 改为 unmounted。同时,还提供了新的钩子函数,如 onMountedonUpdatedonUnmounted 等,使得在组合式 API 中使用生命周期钩子更加方便。
模板语法
  • Vue 2:模板语法基本满足开发需求,但组件必须有一个根节点。例如:
<template><div><!-- 组件内容 --></div>
</template>
  • Vue 3:支持多个根节点,模板结构更加灵活。例如:
<template><header><!-- 头部内容 --></header><main><!-- 主体内容 --></main><footer><!-- 底部内容 --></footer>
</template>

架构设计

TypeScript 支持
  • Vue 2:对 TypeScript 的支持相对有限,使用 TypeScript 开发时需要编写较多的声明文件,类型推导不够友好,开发体验不够流畅。
  • Vue 3:从设计之初就考虑了对 TypeScript 的支持,组合式 API 与 TypeScript 配合更加默契,能提供更好的类型推导和类型检查。例如,在 setup 函数中可以更方便地定义和使用类型,减少了类型相关的错误。
新特性引入
  • Vue 2:具备基本的组件化、响应式等功能,但缺乏一些处理复杂场景的高级特性。
  • Vue 3:引入了一些新特性,如 TeleportSuspense
    • Teleport:可以将组件的一部分模板渲染到 DOM 的其他位置,方便处理模态框、提示框等场景。例如:
<template><div><button @click="showModal = true">Open Modal</button><Teleport to="body"><div v-if="showModal" class="modal"><!-- 模态框内容 --><button @click="showModal = false">Close Modal</button></div></Teleport></div>
</template>
- **Suspense**:用于处理异步组件的加载状态,使异步组件的加载管理更加简单。例如:
<template><Suspense><template #default><AsyncComponent /></template><template #fallback><p>Loading...</p></template></Suspense>
</template>

项目构建和生态系统

构建工具
  • Vue 2:常用的构建工具是 Vue CLI,它基于 Webpack 进行项目构建。Webpack 功能强大,但配置复杂,启动和热更新速度相对较慢。
  • Vue 3:除了 Vue CLI 外,Vite 成为了 Vue 3 项目的推荐构建工具。Vite 具有快速冷启动、即时热更新等优点,能显著提升开发效率。Vite 利用浏览器的原生 ES 模块导入功能,在开发阶段无需打包,直接提供源码给浏览器,从而实现快速启动。
生态系统兼容性
  • Vue 2:拥有庞大的生态系统,有大量的插件和库可供使用。但部分插件可能需要一定的时间来适配 Vue 3。
  • Vue 3:生态系统在不断发展和完善,越来越多的插件和库开始支持 Vue 3,同时一些新的生态工具也在不断涌现。例如,Pinia 作为新一代的状态管理库,在 Vue 3 中得到了广泛应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20928.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot-ffmpeg-m3u8-convertor nplayer视频播放弹幕 artplayer视频弹幕

学习链接 ffmpeg-cli-wrapper - 内部封装了操作ffmpeg命令的java类库&#xff0c;它提供了一些类和方法&#xff0c;可以方便地构建和执行 ffmpeg 命令&#xff0c;而不需要直接操作字符串或进程。并且支持异步执行和进度监听 springboot-ffmpeg-m3u8-convertor - gitee代码 …

Linux下centos系统中使用docker容器中的ollama下载deepseek速度太慢解决办法

以下是使用shell脚本实现的一个示例&#xff0c;该脚本会尝试下载一个名为"deepseek-r1:32b"的模型。通过每隔60秒中断一次下载操作&#xff0c;从何恢复下载速度。亲测有效,其中需要将模型改为你自己要下载的模型 #!/bin/bashwhile true; do# 检查模型是否已下载完…

自动创建spring boot应用(eclipse版本)

使用spring starter project创建项目 设置Service URL 把Service URL设置为 https://start.aliyun.com/ 如下图&#xff1a; 使用这个网址&#xff0c;创建项目更快。 选择Spring Web依赖 项目结构 mvnw和mvnw.cmd:这是maven包装器&#xff08;wrapper&#xff09;脚本&…

基于flask+vue的租房信息可视化系统

✔️本项目利用 python 网络爬虫抓取某租房网站的租房信息&#xff0c;完成数据清洗和结构化&#xff0c;存储到数据库中&#xff0c;搭建web系统对各个市区的租金、房源信息进行展示&#xff0c;根据各种条件对租金进行预测。 1、数据概览 ​ 将爬取到的数据进行展示&#xff…

uniapp 滚动尺

scale组件代码&#xff08;部分class样式使用到了uview1.0的样式&#xff09; <template><view><view class"scale"><view class"pointer u-flex-col u-col-center"><u-icon name"arrow-down-fill" size"26&qu…

分布式大语言模型服务引擎vLLM论文解读

论文地址&#xff1a;Efficient Memory Management for Large Language Model Serving with PagedAttention 摘要 大语言模型&#xff08;LLMs&#xff09;的高吞吐量服务需要一次对足够多的请求进行批处理。然而&#xff0c;现有系统面临困境&#xff0c;因为每个请求的键值…

【HeadFirst系列之HeadFirst设计模式】第5天之工厂模式:比萨店的秘密武器,轻松搞定对象创建!

工厂模式&#xff1a;比萨店的秘密武器&#xff0c;轻松搞定对象创建&#xff01; 大家好&#xff0c;今天我们来聊聊设计模式中的工厂模式。如果你曾经为对象的创建感到头疼&#xff0c;或者觉得代码中到处都是 new 关键字&#xff0c;那么工厂模式就是你的救星&#xff01;本…

CSS基本选择器

1. 通配选择器 作用&#xff1a;可以选中所有的 HTML 元素。 语法&#xff1a; * { 属性名: 属性值; } 举例&#xff1a; <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" …

Idea24.3 如何设置Git忽略某一个文件

文章目录 左上角找到commit选中你要忽略的文件 右键New Changelist给这个文件夹名称和描述 点击ok将要忽略的文件添加到这个文件夹 左上角找到commit 选中你要忽略的文件 右键New Changelist 给这个文件夹名称和描述 点击ok 将要忽略的文件添加到这个文件夹

ctfshow web入门 web11-web24

web11 web12 进来浏览网站&#xff0c;底部有一串数字&#xff0c;根据提示可能有用&#xff0c;访问robots.txt&#xff0c;发现禁止访问/admin/&#xff0c;进去看看发现需要输入用户名和密码&#xff0c;刚想爆破就猜对了&#xff0c;用户名是admin&#xff0c;密码是页面下…

MySQL笔记-对max_allowed_packet的进一步理解(2024-10-28)

背景 最近不仅仅在做开发&#xff0c;还在不停的做实施&#xff0c;运维。以前都不太喜欢做实施&#xff0c;运维&#xff0c;但是工作6年后&#xff0c;对这些还是比较感兴趣了&#xff0c;毕竟计算机这块不仅仅是开发&#xff0c;还有很多岗位&#xff0c;并且实施和运维会从…

Elasticsearch:探索 CLIP 替代方案

作者&#xff1a;来自 Elastic Jeffrey Rengifo 及 Toms Mura 分析图像到图像和文本到图像搜索的 CLIP 模型的替代方案。 在本文中&#xff0c;我们将通过一个模拟房地产网站的实际示例介绍 CLIP 多模态模型&#xff0c;探索替代方案&#xff0c;并分析它们的优缺点&#xff0c…

Spring中的日志

日志 了解一下 (有个印象) 门面模式 (外观模式) 含有两种角色&#xff1a; Facade (外观角色 / 门面角色): 系统对外的统一接口。SubSystem (子系统角色): 可以含有多个子系统&#xff0c;每个子系统都不是单独的类&#xff0c;而是一个类的集合。 Facade 对 SubSystem 是…

uniapp邪门事件

很久之前在这篇《THREEJS 在 uni-app 中使用&#xff08;微信小程序&#xff09;》&#xff1a;THREEJS 在 uni-app 中使用&#xff08;微信小程序&#xff09;_uni-app_帶刺的小葡萄-华为开发者空间 中学到了如何在uniapp的微信小程序里接入three.js的3d模型 由于小程序自身很…

C#项目04——递归求和

实现逻辑 利用递归&#xff0c;求取1~N以内的和 知识点 正常情况下&#xff0c;C#每条线程都会分配1MB的地址空间&#xff0c;因此执行递归的层次不能太深&#xff0c;否则就会出现溢出的风险&#xff0c; 业务设计 程序代码 private void button1_Click(object sender, E…

SQLMesh 系列教程6- 详解 Python 模型

本文将介绍 SQLMesh 的 Python 模型&#xff0c;探讨其定义、优势及在企业业务场景中的应用。SQLMesh 不仅支持 SQL 模型&#xff0c;还允许通过 Python 编写数据模型&#xff0c;提供更高的灵活性和可编程性。我们将通过一个电商平台的实例&#xff0c;展示如何使用 Python 模…

docker修改镜像默认存储路径(基于 WSL2 的迁移方法)

文章目录 打开powershell窗口1、停止 WSL2、导出数据3、取消注册4、导入数据到新位置5、确认转移情况6、重新启动 Docker Desktop7、查看 打开powershell窗口 任意地方shift右键 1、停止 WSL wsl --shutdown2、导出数据 wsl --export docker-desktop-data E:\docker\Docke…

Java开发实习面试笔试题(含答案)

在广州一家中大公司面试&#xff08;BOSS标注是1000-9999人&#xff0c;薪资2-3k&#xff09;&#xff0c;招聘上写着Java开发&#xff0c;基本没有标注前端要求&#xff0c;但是到场知道是前后端分离人不分离。开始先让你做笔试&#xff08;12道问答4道SQL题&#xff09;&…

火语言RPA--Excel读取内容

【组件功能】&#xff1a;读取Excel内指定位置的内容或读取整篇Sheet页内容 配置预览 配置说明 读取位置 单元格&#xff1a;读取指定单元格中的内容。 行&#xff1a;读取指定行内容。 列&#xff1a;读取指定列内容。 区域&#xff1a;读取指定区域内容。 整篇sheet页&…

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …