Vue 2 与 Vue 3 的全面比较
Vue 2 与 Vue 3 的全面比较
1. 性能提升
Vue 3 的性能得到了显著提升。虚拟 DOM 已经重写,使补丁过程更快。
对比:
Vue 3 使用了基于 Proxy 的新观察者机制,取代了 Vue 2 的基于 Object.defineProperty 的观察者。
Object.defineProperty:
const data = {};
Object.defineProperty(data, 'property1', {value: 42,writable: false
});
Proxy:
const data = {a: 1};
const proxy = new Proxy(data, {get(target, prop) {return target[prop];},set(target, prop, value) {target[prop] = value;console.log('property set');return true;}
});
为何 Proxy 的性能更好?
- 响应性机制:
Object.defineProperty需要递归地遍历一个对象的所有属性并为其定义 getter 和 setter,这在大型对象上可能非常缓慢。相反,Proxy可以拦截整个对象,而无需逐个处理属性。 - 数组问题:Vue 2 在处理数组时遇到了一些问题。为了检测到数组的变化,Vue 2 必须覆盖数组的原型方法(如 push、pop 等),这是一个复杂且可能产生错误的过程。使用
Proxy,Vue 3 可以更简单、更直接地拦截数组的变化。 - 精细的变更检测:使用
Proxy,Vue 3 可以更精确地检测对象的变化。例如,当您添加或删除属性时,Proxy可以立即捕获这些变化,而Object.defineProperty则无法捕获这类变化。 - 未来的优化:由于
Proxy是 ECMAScript 的一个标准特性,未来的 JavaScript 引擎可能会为其提供更多的优化,从而进一步提高性能。
2. 组合式 API
Vue 3 引入了组合式 API,这是一套全新的、可选的、基于函数的 API。
代码示例:
Vue 2:
<script>
export default {data() {return {count: 0}},methods: {increment() {this.count++;}}
}
</script>
Vue 3:
<script>
import { ref } from 'vue';export default {setup() {const count = ref(0);function increment() {count.value++;}return {count,increment};}
}
</script>
3. 按需 Tree Shaking
Vue 3 的大部分核心功能都是基于 Tree shaking 的,这意味着只有你使用的部分才会被打包进最终的代码。
结果:
得到一个更小的打包大小。
4. 更多的内置组件
Vue 3 提供了更多的内置组件,如 <Suspense> 和 <Teleport>。
使用:
<Suspense>:
<Suspense><template #default><AsyncComponent /></template><template #fallback><div>Loading...</div></template>
</Suspense>
<Teleport>:
<Teleport to="body"><div>This will be moved to body tag</div>
</Teleport>
5. 更好的 TypeScript 支持
Vue 3 的源代码完全是用 TypeScript 编写的,这意味着它提供了更好的 TS 支持。
6. 新的自定义事件 API
Vue 3 提供了一个更好、更简洁的 API 来处理组件的自定义事件。
代码示例:
Vue 2:
this.$emit('event-name', payload);
Vue 3:
const emit = ctx.emit;
emit('event-name', payload);
7. 多个根节点
在 Vue 3 中,单文件组件可以有多个根节点。
代码示例:
Vue 2:
<template><div><span>Item 1</span><span>Item 2</span></div>
</template>
Vue 3:
<template><span>Item 1</span><span>Item 2</span>
</template>
8. 更好的默认插槽 API
Vue 3 中的默认插槽的 API 也得到了改进。
使用:
更简洁,更直观。
9. 移除了过滤器
Vue 3 完全移除了过滤器,推荐使用计算属性或方法代替。
代码示例:
Vue 2:
<template><div>{{ message | capitalize }}</div>
</template><script>
export default {filters: {capitalize: function (value) {if (!value) return '';value = value.toString();return value.charAt(0).toUpperCase() + value.slice(1);}}
}
</script>
Vue 3:
<template><div>{{ capitalize(message) }}</div>
</template><script>
export default {methods: {capitalize(value) {if (!value) return '';value = value.toString();return value.charAt(0).toUpperCase() + value.slice(1);}}
}
</script>
10. Portal、Fragments、Suspense 等新特性
Vue 3 还引入了一些其他的新特性和改进。
例如:
- Fragments: 允许模板有多个根节点。
- Suspense: 为异步组件提供了内置支持。
相关文章:
Vue 2 与 Vue 3 的全面比较
Vue 2 与 Vue 3 的全面比较 1. 性能提升 Vue 3 的性能得到了显著提升。虚拟 DOM 已经重写,使补丁过程更快。 对比: Vue 3 使用了基于 Proxy 的新观察者机制,取代了 Vue 2 的基于 Object.defineProperty 的观察者。 Object.definePropert…...
Unity学习笔记--如何优雅简便地利用对象池生成游戏对象(进阶版)LRU + 对象池
前言 之前写过一篇关于对象池的文章,现在来看写的并不是很好,所以来考虑优化下。 现在来看一年前写的代码,越看越不能入目hhh Unity学习笔记–如何优雅简便地利用对象池生成游戏对象 前置知识 Unity学习笔记–使用 C# 开发一个 LRU 代码实…...
【Spring专题】Bean的声明周期流程图
前言 我向来不主张【通过源码】理解业务,因为每个人的能力有限,甚至可能会因为阅读错误导致出现理解上的偏差,所以我决定,还是先帮大家【开天眼】,先整体看看流程图,好知道,Spring在写源码的过…...
C++实现俄罗斯方块(源码+详解)
👂 Take me Hand Acoustic - Ccile Corbel - 单曲 - 网易云音乐 源码Debug工具 (1)cppreference.com (主) (2)必应 (bing.com) (3)GPT(主) &#…...
01:STM32点灯大师和蜂鸣器
目录 一:点亮1个LED 1:连接图 2:函数介绍 3:点灯代码 二:LED闪烁 1:函数介绍 2:闪烁代码 三:LED流水灯 1:连接图 2:函数介绍 3:流水灯代码 四:蜂鸣器 1:连接图 2:蜂鸣器代码 一:点亮1个LED 1:连接图 因为IO口与LED负极相连所以IO口输出低电频,点亮LED (采用的是低…...
linux pwn 基础知识
环境搭建 虚拟机安装 镜像下载网站为了避免环境问题建议 22.04 ,20.04,18.04,16.04 等常见版本 ubuntu 虚拟机环境各准备一份。注意定期更新快照以防意外。虚拟机建议硬盘 256 G 以上,内存也尽量大一些。硬盘大小只是上界&#…...
Unity Poisson分布 【由ChatGPT生成】
Unity Poisson分布 【由ChatGPT生成】 前言项目Unity场景布置代码编写添加并设置脚本运行效果总结 前言 在Unity游戏开发中,数学和统计学的概念常常用于解决各种问题,从资源分配到游戏机制的设计。本文将探讨Poisson分布在Unity游戏开发中的实际应用和作…...
permission denied while trying to connect to the Docker daemon socket 错误
安装 docker 执行错误如下: $ docker pspermission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json”: dial unix /var/run/docker.sock: connect:…...
pytorch nn.ModuleList和nn.Sequential的用法笔记
有部分内容转自: pytorch小记:nn.ModuleList和nn.Sequential的用法以及区别_慕思侣的博客-CSDN博客 但是有部分内容做了修改调整, 在构建网络的时候,pytorch有一些基础概念很重要,比如nn.Module,nn.ModuleList,nn.Sequential,这些类我们称为为容器(containers),可…...
SQL | 高级数据过滤
5-高级数据过滤 通过组合WHERE子句,建立功能更强的检索语句。 5.1-组合WHERE子句 前面写的都是单一条件下的WHERE子句,SQL语句允许给出多个WHERE子句来组合检索,这些WHERE子句通过AND子句或者OR子句进行连接。 操作符(operato…...
ARM架构银河麒麟docker,源码编译安装GDAL
docker中安装依赖 sudo apt-get update sudo apt-get install build-essential autoconf automake libtool sudo apt-get install libproj-dev libgeos-dev libjson-c-dev libpng-dev libjpeg-dev sudo apt-get install python3-dev sudo apt-get install python3.11-dev去官网…...
(3)原神角色数据分析-3
绘图类 在名为“WRITEPHOT.py”的文件中,定义如下绘图方式,则在主页面(app.py)文件中,可通过如下方式调用: from WRITEPHOTO import WriteScatter,WriteFunnel,WriteBarData,WritePie,WriteLineBar 代码如下: "…...
skywalking日志收集
文章目录 一、介绍二、添加依赖三、修改日志配置1. 添加链路表示traceId2. 添加链路上下文3. 异步日志 四、收集链路日志 一、介绍 在上一篇文章skywalking全链路追踪中我们介绍了在微服务项目中使用skywalking进行服务调用链路的追踪。 本文在全链路追踪的基础上,…...
ASL国产CS5212规格书 DP转VGA 替代RTD2166低成本方案 兼容IT6516设计原理图
CS5212可替代兼容瑞昱RTD2166和联阳T6516,ASL集睿致远这款芯片是一种高性能的DP显示端口到VGA转换器芯片。它结合了DisplayPort输入接口和模拟RGB DAC输出接口,嵌入式单片机基于工业标准8051核心。 CS5212适用于多个细分市场和显示器应用程序࿱…...
关于Jquery的Validate插件--rules添加自定义方法(强密码验证方法)
简介:请看菜鸟教程,根据给出的方法,自定义识别密码是否为复杂密码的方法 链接: https://www.runoob.com/jquery/jquery-plugin-validate.html Query Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单&#…...
股票自动交易接口开发原理及源码分享
股票自动交易接口的开发原理涉及多个方面,主要包括以下几个步骤: 1. 数据接口获取:通过连接到证券交易所或第三方数据提供商的API,获取实时市场数据,包括股票报价、交易成交量、买卖盘口等信息。 2. 策略定义&#x…...
2023/8/11题解
时间限制: 1000MS 内存限制: 65536KB 解题思路 建树 模拟 ,复杂在于建树,此处从题目需求可知需要按层建树,所以需要队列模拟,查找比较容易就是普通的深搜 参考代码 #include<bits/stdc.h> using namespace std; vector<…...
构造函数
一、构造函数 构造函数用来在创建对象时初始化对象,为对象数据成员赋初始值。 类的数据成员是不能在类定义时初始化的,类定义并没有产生一个实体,而是给出了一个数据类型,不占用存储空间,无处容纳数据。 如果一个类…...
JS 原型与继承
本文内容学习于:后盾人 (houdunren.com) 一、原型对象 每个对象都有一个原型prototype对象,通过函数创建的对象也将拥有这个原型对象。 原型是一个指向对象的指针。 1.可以将原型理解为对象的父亲,对象从原型对象继承来属性 2.原型就是对象…...
解决 Oracle 数据库中表被锁问题的方案和方法
我们经常会遇到表被锁的情况,这可能会严重影响数据库的性能和可用性。我将与大家分享如何识别、分析和解决这些问题,以及如何使用特定的 SQL 查询来执行解锁操作。 了解表锁的原因 首先,让我们来了解一下导致表被锁的常见原因。长时间运行的…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
