vue3相对vue2有哪些改变?

https://blog.csdn.net/weixin_44475093/article/details/112386778
https://blog.csdn.net/userDengDeng/article/details/114941956

一、vue3的新特性:

1、速度更快

vue3相比vue2

  • 重写了虚拟Dom实现
  • 编译模板的优化
  • 更高效的组件初始化
  • undate性能提高1.3~2倍
  • SSR速度提高了2~3倍
  • 体积减小

2、体积更小

通过webpack的tree-shaking功能,可以将无用模块“剪辑”,仅打包需要的能够tree-shaking,有两大好处:

  • 对开发人员,能够对vue实现更多其他的功能,而不必担忧整体体积过大。
  • 对使用者,打包出来的包体积变小了

3、更易维护

compositon Api
composition Api,也就是组合式api,通过这种形式,我们能够更加容易维护我们的代码,将相同功能的变量进行一个集中式的管理。

  • 可与现有的Options API一起使用
  • 灵活的逻辑组合与复用
  • Vue3模块可以和其他框架搭配使用


    image.png

4、 更好的Typescript支持

VUE3是基于typescipt编写的,可以享受到自动的类型定义提示

5、更接近原生

6、更易使用

第二篇文章

源码组织方式的变化

 使用 typescript 重写

Composition Api

1、vue.js 3.x 新增的一组 API
2、一组基于函数的API
3、可以更灵活的组织组件的逻辑

性能提升

响应式系统升级

  1. vue.js 2.x 中响应式系统的核心 defineProperty
  2. Vue.js 3.x 中使用 proxy 对象重写响应式系统
    1. 可以监听动态新增的属性
    2. 可以监听删除的属性
    3. 可以监听数组的索引和length属性

编译优化

vue.js 2.x 中通过标记静态根结点,优化 diff 的过程
vue.js 3.x 中标记和提升所有的静态根节点,diff 的时候只需要对比动态节点的内容。
1、 静态提升
2、 Patch flag
3、事件监听缓存:cacheHandlers

优化打包体积

 Tree-shaking

二、vue2.x和vue3.x中的双向数据绑定原理有什么不同?

1、vue2.x实现原理

主要还是通过Object.defineProperty实现双向数据绑定的。
observe方法的具体逻辑:

Vue.prototype.observe = function(obj) {var value = '',_this = this;for (var key in obj) {value = obj[key];(function(key, value) {if (typeof obj[key] === 'object') {this.observe(obj[key]);} else {Object.defineProperty(_this.$data, key, {get: function() {console.log('get value');return value;},set: function(newVal) {value = newVal;_this.render();}});}})(key, value);}
}

2、vue3.x实现原理

vue3.x主要使用的是proxy对象,proxy对象的定义是:Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。
使用语法如下:

let p = new Proxy(target, handler);

参数如下:
target: 用Proxy包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
handler: 一个对象,其属性是当执行一个操作时定义代理的行为的函数。

var ob = {a: 1,b: 2
}
var obj = new Proxy(ob, {// target就是第一个参数ob, receive就是返回的obj(返回的proxy对象)get: function(target, key, receive) {// 返回该属性值return target[key];},set: function(target, key, newVal, receive) {// 执行赋值操作target[key] = newVal;}
})

3. Proxy的优势

相比于vue2.x,使用proxy的优势如下:

  • defineProperty只能监听某个属性,不能对全对象监听
  • 可以省去for in、闭包等内容来提升效率(直接绑定整个对象即可)
  • 可以监听数组,不用再去单独的对数组做特异性操作。

4、Proxy带来的问题:

Proxy的问题在于浏览器兼容有点问题,IE下完全不兼容,如果要兼容的话应该是需要添加polyfill等内容。

三、Vue3 如何重写 Vdom

https://blog.csdn.net/qq_26443535/article/details/114079572

1、patch flag 优化静态树

当我们创建了一个动态的 dom 元素,我们发现创建动态 dom 元素的 时候,Vdom 除了模拟出来了它的基本信息之外,还给它加了一个标 记: 1 /* TEXT */,这个标记就叫做 patch flag(补丁标记)
patch flag 的强大之处在于,当你的 diff 算法走到 _createBlock 函数的时候,会忽略所有的静态节点,只对有标记的动态节点进行对比。

2、 patch flag 优化静态属性

只关注它有变化的部分。

3、静态提升

刚刚我们提到 Vue3 突破 Vdom 的性能瓶颈的方式是,而在更新时具体的做法就是 静态树的提升 和 静态属性的提升。
我们已经知道处理后的 Vdom 都在 _createBlock 函数之中,而观察结果我们发现,所有的静态元素都被放在了 _createBlock 函数之外了,也就是说他们只会在页面初始的时候被渲染一次,而在更新的时候,静>态元素是不予搭理的。这个优化就是 Vue3 的 静态提升。

4、事件监听缓存:cacheHandlers

使用cacheHandlers之后,会自动会生成一个内联函数,在内联函数里面在引用当前组件最新的onClick,再把这个内联函数cache起来。
第一次渲染的时候,创建这个内联函数,并将这个内联函数缓存起来,后续的更新就从缓存里面读同一个函数,同一个函数就没有更新的必要了,通过这种事件监听缓存的方式也能对性能提升起到作用。

四、vue3的新增的composition Api及使用

https://juejin.cn/post/6875253488017342478

1)Vue3为什么要使用Composition API?

为了解决什么问题?
当前使用Vue2开发的项目,普遍存在的问题:

  • 代码的可读性随着组件变大而变差
  • 每一种代码复用的方式,都存在缺点
  • TypeScript支持有限
2)常用的api方法:

1、ref和reactive
将数据创建和监听响应式就需要通过vue暴露出来的功能 ref或reactive。两者有所区别,ref用于基础赋值类型的数据,而reactive用于引用类型的数据。

其中基础赋值类型的值,在setup方法中,需要用 .value的方式进行获取和修改。因为赋值类型的值如果return出去返回值,就失去了数据的双绑定。但是在template中,可以进行直接访问。

我们来讨论一下两者选择问题:

  • 如果是单值,建议ref,哪怕是个单值的对象也可以
const counterRef = ref(1)
const usersRef = ref(['tom', 'jerry'])
  • 一个业务关注点有多个值,建议reactive
const mouse = reactive({x: 0,y: 0
})

2、watchEffect和watch有啥不同?
这俩方法很相似,都是观察响应式数据,变化执行副作用函数,但有如下不同:

  • watch需要明确指定监视目标,
watch(() => state.counter, (val, prevVal) => {})
  • watchEffect不需要
watchEffect(() => {console.log(state.counter)
})

watch可以获取变化前后的值
watch是懒执行的,它等效于vue2中的this.$watch(),watchEffect为了收集依赖,要立即执行一次。
3、setup
setup是vue新增的一个选项,它是组件内使用Composition API的入口。setup是在创建vue组件实例并完成props的初始化之后执行

4、生命周期

  • beforeCreate -> 使用 setup()
  • created -> 使用 setup()
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeDestroy -> onBeforeUnmount
  • destroyed -> onUnmounted
  • errorCaptured -> onErrorCaptured


喜欢的朋友记得点赞、收藏、关注哦!!!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据库概论实验一

声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 本文章对数据库概论实验一_求出一箱(每箱装100个)零件的重量 并将输出结果-CSDN博客文章浏览阅读2.7k次,点赞4次,收藏25次。实验数据库,表…

绿色能源发展关键:优化风电运维体系

根据QYResearch调研团队最新发布的《全球风电运维市场报告2023-2029》显示,预计到2029年,全球风电运维市场的规模将攀升至307.8亿美元,并且在接下来的几年里,其年复合增长率(CAGR)将达到12.5%。 上述图表及…

gerrit 搭建遇到的问题

1、启动Apache,端口被占用 : AH00072: make sock: could not bind to address (0S 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: AH00072: make sock: could not bind to address 0.0.0.:443 a AH00451: no listening sockets available, shutti…

栈和队列相关题 , 用队列实现栈, 用栈实现队列 ,设计循环队列 C/C++双版本

文章目录 1.用队列实现栈2.用栈实现队列3. 设计循环队列 1.用队列实现栈 225. 用队列实现栈 思路: 使用两个队列,始终保持一个队列为空。 当我们需要进行压栈操作时,将数据压入不为空的队列中(若两个都为空,则随便压…

关于STM32在代码中的而GPIO里面的寄存器(ODR等)不需要宏定义的问题

1.GPIO为什么需要宏定义地址 在 STM32 这样的微控制器中,硬件寄存器的地址是固定的并且特定于每个外设(比如 GPIOA、GPIOB 等)。为了方便代码访问这些硬件寄存器,我们通常会使用宏定义来指定每个外设的基地址。这样做有几个理由&a…

kimi智能助手,5大高阶玩法,95%的人还不知道

01 智能搜索:精准定位,一键获取最佳答案 Kimi,作为您的AI助手,拥有卓越的网络搜索能力。 我们能够迅速穿梭于信息海洋,为您筛选出五篇精选网络文章,并提供直接的网址链接。 Kimi的总结能力同样出色,特别适合那些追求效率、不愿深陷长篇文章的用户。 02 PDF速读:快速把…

关于数学建模的一些介绍

为了更好了解世界,我们可以通过数学来描述许多特定的现象,而数学模型就是现实世界的理想化,不过它永远不能完全精确地表示现实世界。 在这篇文章中,我将介绍一些数学建模的基本概念以及相应的基础知识,而关于更具体的…

远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!

一,概述 FP7209是台湾远翔一款非同步升压LED驱动IC,封装有2种,分别是SOP-8L(EP), TSSOP-14L(EP)。控制外部开关NMOS。 输入低启动电压2.8V,可支持单节锂电池供电。工作电压5V,VFB反馈电压0.25V,反馈电压低…

算法日记 18 day 二叉树

最后三题,二叉树就结束啦!!! 题目:修剪二叉搜索树 669. 修剪二叉搜索树 - 力扣(LeetCode) 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树…

hashcat使用

0.介绍 Hashcat 软件是一款非常强大的、开源的、号称世界上最快的密码破解软件,配合强大的字典,可以破译超过百分之九十的密码。Hashcat 目前支持各类公开算法高达240类,市面上公开的密码加密算法基本都支持,有 Microsoft LM 哈希…

mysql 安装 windows

新版安装 新版本安装 如果出现initializing database无法安装 则用我当前版本传送门 如MySQL 安装时没有developer default 选项 解决方法传送门 如果上述还不行 可以选择full 汉化下载 传送门

基于Redis缓存机制实现高并发接口调试

创建接口 这里使用的是阿里云提供的接口服务直接做的测试,接口地址 curl http://localhost:8080/initData?tokenAppWithRedis 这里主要通过参数cacheFirstfalse和true来区分是否走缓存,正常的业务机制可能是通过后台代码逻辑自行控制的,这…

vue常见题型(1-10)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 2.2双向绑定的原理是什么vue框架采用的是数据双向绑定的方式,由三个重要部分构成2.2.1.ViewModel2.2.2 双向绑定2.2.3.1.编译Compile2.2.3.2.依赖收集 3…

C语言变量与强制类型转换深度解析

在上一篇文章中,小编对数据类型进行了详细的讲解与剖析,所以本篇文章小编要带大家理解变量和强制类型转。还是老规矩,来波鸡汤,学习一定不能着急,无法一下就学明白的知识我们需要给他时间,一定不要在一个知…

JAVA+微信小程序前后端源码 微信OCR识别 识别身份证信息

官方文档:身份证识别 | 微信开放文档 实现效果 : 用的奥巴马的网络图片测试,图片 后端JAVA代码 这里用的若依的后端,前后端分离版的 package com.ruoyi.common.utils;import java.io.File; import java.io.IOException;import org.apache.http.HttpEntity; import org.apac…

SL6605 输入0.8-5.5V 单颗锂电池驱动LED升压恒流限流方案

一、芯片特性 输入电压范围广:SL6605可接受0.8V至5.5V的输入电压,使其能够轻松应对各种锂电池电压波动。升压恒流功能:该芯片具有升压能力,可将低电压输入转换为适合LED驱动的高电压,并保持恒定的输出电流。限流保护&…

ubuntu 安装go和vscode

1 安装Go 打开终端,执行以下命令下载Golang安装包: wget https://golang.org/dl/go1.xx.x.linux-amd64.tar.gz注意:替换命令中的“1.xx.x”为最新版本号,例如:1.23.2. 2. 解压安装包: sudo tar -C /usr/…

[spring源码]spring启动流程

spring启动流程 AnnotationConfigApplicationContext的构造方法 1.父类构造方法,构造一个DefaultListableBeanFactory 在调用AnnotationConfigApplicationContext的构造方法之前,会调用父类GenericApplicationContext的无参构造方法,会构造…

Kafka自动生产消息软件(自动化测试Kafka)

点击下载《Kafka服务端(含Zookeeper)一键自启软件》 点击下载《kafka客户端生产者消费者kafka可视化工具(可生产和消费消息)》 点击下载《Kafka自动生产消息软件》 1. 前言 在软件开发过程中,Kafka常被用作消息队列来处理特定的业务功能。为…

debian系统安装qt的时候 显示xcb相关文件缺失

如果是安装之后的问题 我们可以选择使用ldd的命令查看当前依赖的so那些文件确实 ldd /home/yinsir/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so 本人在进行打包的时候 出现则会个报错 ERROR: ldd outputLine: “libxcb-util.so.1 > not found” ERROR: for binary: “/…