VUE2升级成VUE3的优化与区别

大家好,我是小编阿贤。欢迎各位大神关注《全栈技术圈》,让技术更加简单易懂。

1. vue2和vue3实例区别

1.1 创建一个vue2实例

在vue2里面的Vue是一个构造函数,通过该构造函数创建一个Vue实例,data选项可以是对象,也可以是方法返回一个对象。可以通过el选项指定一个挂载的容器,也可以通过$mount()方法指定挂载的容器。

 new Vue({el: '#app',data: {name: 'Vue2',age: '6'}
}).$mount('#app') 
1.2 创建一个vue3实例

在vue3里面Vue是一个对象,通过该对象的createApp()方法,创建一个Vue实例。vue3中,取消了el选项。vue3中,无论是组件和是vue实例,data选项都必须是一个方法,由方法返回对象。

Vue.createApp({//el: '#app',data() {return {name: 'Vue3',age: '2'}}
}).mount('#app')

2.Vue2和Vue3的响应式区别

2.1 vue2的响应式

在addSex方法中后添加的属性是非响应式的。在delName方法中直接使用delete方式删除对象的属性后,不具备响应式。在addFood方法中操作数组后同时要具有响应式。推荐使用$set方法根据下标添加数组元素,确保新添加的元素同样具备响应式。在delFood方法中直接根据下标删除数组元素,不具备响应式。

new Vue({el:'#app',data:{student:{name:'张三',age:20},foods:['鱼翅','松茸','鱼子酱','帝王蟹','熊掌']},methods: {addSex(){ //添加性别// this.student.sex='男'//可以通过$forceUpdate()强制页面更新一次// this.$forceUpdate()//推荐使用$set方法给对象添加新的属性,确保新添加的属性同样具备响应式this.$set(this.student,'sex','男')},delName(){ //删除姓名// 不具备响应式// delete this.student.name//使用$delete方法,删除对象的属性后,继续具备响应式this.$delete(this.student,'name')},addFood(){ //添加食物// 具有响应式,必须要使用下面的方法:// push pop unshift shift sort reverse splice// this.foods.push('佛跳墙')// this.foods[5] = '佛跳墙'// this.$forceUpdate()this.$set(this.foods,5,'佛跳墙')},//删除食物delFood(){// this.foods.splice(3,1)//不具备响应式// this.foods[3] = null//使用$delete方法,删除数组中指定位置的元素,继续具备响应式this.$delete(this.foods,3)}}
})
2.2 vue3修复了vue2中响应式的所有缺陷

vue3后续新增属性值具有响应式,delete自己删除属性也具有响应式。

 Vue.createApp({data() {return {student:{name:'张三',age:20},foods:['鱼翅','松茸','鱼子酱','帝王蟹','熊掌']}},methods: {addSex(){this.student.sex = '男'},delName(){delete this.student.name},addFood(){this.foods[5] = '佛跳墙'},delFood(){delete this.foods[3]}}
}).mount("#app")

3 Vue2和Vue3的响应式原理

3.1 vue2的响应式原理

vue2在实例化时,会将data里面的所有数据采用 Object.defineProperty 进行处理,实现实现响应式功能。但是你之后往data里面添加的数据,由于没有采用 Object.defineProperty 进行处理,所以不具备响应式。$set()方法,内部就是对单个属性重新采用 Object.defineProperty 进行处理,从而具备响应式。

//源对象
let obj = {name:'张三',age:20,sex:'男'
};
document.querySelector('#name').innerHTML = obj.name;
document.querySelector('#age').innerHTML = obj.age;
document.querySelector('#sex').innerHTML = obj.sex;
//定义一个obj2对象,作为obj的代理对象
let obj2 = {};
//通过Object.defineProperty方法,给obj2添加属性
Object.defineProperty(obj2, 'name', {//读取属性的值,调用get方法get(){return obj.name;},//设置属性的值,调用set方法set(val){obj.name = val;document.querySelector('#name').innerHTML = obj.name;}
});
Object.defineProperty(obj2, 'age', {//读取属性的值,调用get方法get(){return obj.age;},//设置属性的值,调用set方法set(val){obj.age = val;document.querySelector('#age').innerHTML = obj.age;}
});
Object.defineProperty(obj2,'sex',{//读取属性的值,调用get方法get(){return obj.sex},//设置属性的值,调用set方法set(val){obj.sex = valdocument.querySelector('#sex').innerHTML = obj.sex}
});
3.2 vue3的响应式原理

使用new Proxy()创建一个代理对象,通过放射对象从指定的对象身上发射出指定的属性值。

// 源对象
let obj3 = {name:'张三',age:20,sex:'男'
}
document.querySelector('#name2').innerHTML = obj3.name
document.querySelector('#age2').innerHTML = obj3.age
document.querySelector('#sex2').innerHTML = obj3.sex
let obj4 = new Proxy(obj3, {//获取属性get(target, property){// 直接返回源对象身上的指定的属性值// return target[property];// 通过放射对象从指定的对象身上发射出指定的属性值return Reflect.get(target, property);},//设置属性set(target, property, value){// target[property] = value;Reflect.set(target,property,value);document.querySelector(`#${property}2`).innerHTML = Reflect.get(target,property);},//删除属性deleteProperty(target, property){// return delete target[property];document.querySelector(`#${property}2`).remove();return Reflect.deleteProperty(target,property);}
});

4 Vue3新推出的组合式API

4.1 vue2中只能这样写代码,vue3也可以这样写
data() {return {carName:'保时捷',carPrice:'100W'}
},
methods: {updateCar(){this.carName = '特斯拉'this.carPrice = '80W'}
}
4.2 vue3引入了全新的功能,组合式API

组合式api的作用是:将原来分散开来定义的数据,方法,计算属性,监听器,组合起来定义一个完整的业务。

// ref用于定义响应式数据
let {ref} = Vue
Vue.createApp({// setup是组合式api的舞台,所有的组合式api都要在setup里面使用setup() {//定义汽车相关数据// 使用ref()方法,定义一个响应式对象let carName=ref('保时捷')let carPrice=ref('100W')//定义汽车相关方法function updateCar(){//修改对象的值,要通过value属性carName.value = '特斯拉'carPrice.value = '80W'}return{//返回汽车相关数据carName,carPrice,updateCar,}})
})

总结:

Vue2升级Vue3带来更快的改动主要有两方面
1、vue3重新审视了 vdom,更改了自身对于 vdom的对比算法。vdom从之前的每次更新,都进行一次完整遍历对比,改为了切分区块树,来进行动态内容更新。也就是只更新 vdom的绑定了动态数据的部分,把速度提高了6倍;
2、 把 definePerproty改为了 proxy,对于 JavaScript引擎更加友好,响应更加高效。
本篇文件先写到这后续我们在深入Vue3升级改动。欢迎各位大神关注《全栈技术圈》,让技术更加简单易懂。

关注全栈技术圈,全面提升技术。

本作品系原创。禁止转载,如需转载请通过简信或评论联系作者。

最后编辑于:2024-10-27 15:58:36


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

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

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

相关文章

ProLightsfx新的出发–从CSDN到WordPress

原文链接:ProLightsfx新的出发--从CSDN到WordPress_ProLightsfx的技术分享 (https://www.prolightsfxjh.com/article/article-new-start/) 大概有差不多2年时间没有在csdn发布文章了。可能主要是最近几年工作有些疲惫、精神有些懈怠&#xff…

「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现

自定义动画让开发者可以设计更加个性化和复杂的动画效果,适合表现独特的界面元素。鸿蒙提供了丰富的工具,支持通过自定义路径和时间控制来创建复杂的动画运动。本篇将带你学习如何通过自定义动画实现更多样化的效果。 关键词 自定义动画动画路径贝塞尔曲…

GPIO子系统中Controller驱动源码分析

往期内容 本专栏往期内容: Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体Pinctrl子系统中c…

【Linux系统编程】第四十二弹---多线程编程全攻略:涵盖线程创建、异常处理、用途、进程对比及线程控制

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程创建 2、线程异常 3、线程用途 4、进程 VS 线程 5、线程控制 5.1、创建和等待线程 1、线程创建 线程能看到进程的大…

Qt入门基础分享

文章目录 学习 Qt 语言之前的基本知识1. 编程基础语法:面向对象编程(OOP):基本数据结构:了解数组、链表、栈、队列、树(如二叉树、平衡树)、图(如邻接矩阵、邻接表)等。算法:熟悉常见的排序算法(如快速排序、归并排序、冒泡排序)和查找算法(如线性查找、二分查找)…

超萌!HTMLCSS:超萌卡通熊猫头

效果演示 创建了一个卡通风格的熊猫头 HTML <div class"box"><div class"head"><div class"head-copy"></div><div class"ears-left"></div><div class"ears-right"></di…

使用 AMD GPU 的 ChatGLM-6B 双语语言模型

Using the ChatGLM-6B bilingual language model with AMD GPUs — ROCm Blogs 2024 年 4 月 4 日&#xff0c;作者&#xff1a; Phillip Dang. ChatGLM-6B 是一个开源的中英双语语言模型&#xff0c;拥有 62 亿参数。它基于通用语言模型 (GLM) 架构&#xff0c;针对中文对话进…

计算并联电阻的阻值

计算并联电阻的阻值 C语言代码C代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 对于阻值为r1和r2的电阻&#xff0c;其并联电阻阻值公式计算如下&#xff1a; R1/(1/r11/r2) 输入 两个电阻阻抗大小&#xff0c;浮…

创建线程时传递参数给线程

在C中&#xff0c;可以使用 std::thread 来创建和管理线程&#xff0c;同时可以通过几种方式将参数传递给线程函数。这些方法包括使用值传递、引用传递和指针传递。下面将对这些方法进行详细讲解并给出相应的代码示例。 1. 值传递参数 当你创建线程并希望传递参数时&#xff…

AAA 数据库事务隔离级别及死锁

目录 一、事务的四大特性&#xff08;ACID&#xff09; 1. 原子性(atomicity)&#xff1a; 2. 一致性(consistency)&#xff1a; 3. 隔离性(isolation)&#xff1a; 4. 持久性(durability)&#xff1a; 二、死锁的产生及解决方法 三、事务的四种隔离级别 0 .封锁协议 …

数字后端零基础入门系列 | Innovus零基础LAB学习Day9

Module 16 Wire Editing 这个章节的学习目标是学习如何在innovus中手工画线&#xff0c;切断一根线&#xff0c;换孔&#xff0c;更改一条net shape的layer和width等等。这个技能是每个数字IC后端工程师必须具备的。因为项目后期都需要这些技能来修复DRC和做一些手工custom走线…

前后端交互通用排序策略

目录 排序场景 排序实现思路 1. 静态代码排序实现 2.数据库驱动排序实现 3. 基于Java反射的动态排序实现 通用排序工具 SortListUtil 结语 排序场景 在面向前端数据展示的应用场景中&#xff0c;我们旨在实现一个更加灵活的排序机制&#xff0c;该机制能够支持对从后端传递…

前端入门一之CSS知识详解

前言 CSS是前端三件套之一&#xff0c;在MarkDown中也完美兼容这些语法&#xff1b;这篇文章是本人大一学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 Emmet语法&#xff1a;CSS基本语法&#xff1a;css语法结构只有3种&#xff1a…

leetcode | 88. 合并两个有序数组

题目描述 88. 合并两个有序数组 分析 题目不允许更改nums1的长度&#xff0c;要求原地更改。 题目其实不难&#xff0c;如果记住可以从后往前合并的解法&#xff0c;但是正向遍历的问题是什么呢&#xff1f; ——元素覆盖。那为什么负向遍历就不会有这个问题呢&#xff1f;…

跳蚤市场之商品发布功能

一 商品类别和小类的联动 以下是一个示例代码&#xff0c;展示了如何实现商品类别中大类和小类的联动。 商品大类选择框、小类选择框 的设计 html部分 <form id"category-form"><label for"major-category">大类&#xff1a;</label&g…

OpenAI 发布了新的事实性基准——SimpleQA

SimpleQA 简介 名为 SimpleQA 的事实性基准&#xff0c;用于衡量语言模型回答简短的事实性问题的能力。 人工智能领域的一个悬而未决的问题是如何训练模型&#xff0c;使其产生符合事实的回答。 目前的语言模型有时会产生错误的输出或没有证据证明的答案&#xff0c;这个问题…

Android camera2

一、序言 为了对阶段性的知识积累、方便以后调查问题&#xff0c;特做此文档&#xff01; 将以camera app 使用camera2 api进行分析。 (1)、打开相机 openCamera (2)、创建会话 createCaptureSession (3)、开始预览 setRepeatingRequest (4)、停止预览 stopRepeating (5)、关闭…

Javascript属性遮蔽问题

先了解一下Object.defineProperty()方法 Object.defineProperty() 静态方法会直接在一个对象上定义一个新属性&#xff0c;或修改其现有属性&#xff0c;并返回此对象。 //obj&#xff1a;要定义的对象 //prop&#xff1a;一个字符串或 Symbol&#xff0c;指定了要定义或修改…

vue3项目history模式部署404处理,使用 historyApiFallback 中间件支持单页面应用路由

vue3项目history模式部署404处理&#xff0c;使用 historyApiFallback 中间件支持单页面应用路由 在现代的 web 开发中&#xff0c;单页面应用&#xff08;SPA&#xff09;变得越来越流行。这类应用通常依赖于客户端路由来提供流畅的用户体验&#xff0c;但在服务器端&#xf…