初探 Vue3 新特性

news2024/11/18 23:49:38

在本讲中,我们只会概述性的来介绍一下 Vue3 中新增的一些主要内容,而这些主要知识点的详细的使用和功能以及作用,我们会在后面的课程里面逐渐的给大家去解锁。那么明确好了我们的学习目标之后呢?

我们来看一下 Vue3 之中到底新增了哪些比较核心的功能呢?让我们拭目以待吧。

Composition API 组合语法

在看 Composition API 之前,我们聊聊 Vue2 中 Options API 存在的问题。

Options API 是 Vue2 里面的开发形式,Options API 它存在着方便、易学、清晰等等一些特点。但是它在存在着这些特点的同时,也存在着一些问题,而其中最主要的一个问题就是:当你的组件变得越来越复杂的时候,你组件的可读性在变得越来越差,并且不易维护。

对于 Vue2 中 Options API 来说,所有的 methods、computed、watch 都在一个对象里配置,这对小应用来说,还是可以接受。但是,如果是一个大型应用,代码超过几千行的时候,新增或者修改一个功能,就需要不停地在 data、methods 里翻来翻去地写代码,这样的操作称之为上下反复横跳。如果大家也遇到过这种情况,应该也深有感触,我们在写整个代码时好像总是在不停的翻滚。

那为什么会出现这样一种情况呢?这是因为在 Vue2 中 Options API 里面,整体的组件代码结构如下图。

在这里插入图片描述
其中,同样颜色的部分表示使用了同样的一块数据,比如,首先我们在前面定义了 Data,然后在 Method 去使用这个 Data。如果我们需要查看 Data 在哪些方法使用,此时就得上下来回的翻滚。

这样不停翻滚的操作,就大大的影响到了用户体验,并且随着你的组件的复杂度越来越高,这种情况会变得越来越严重,而这个就是 Options API 所存在的一个问题。

而 Vue3 中的 Composition API 要解决就是这个问题,下面这个示例图很好地说明了问题。其中左边是使用 OptionS API 去完成的代码,而右边是使用 Composition API 去完成的代码。其实这两块代码对比起来,最大的一个变化就是相同颜色的区块被放到了一起了,而这个也就是 Composition API 最主要的一块内容,就是把定义数据和使用数据放到一起去进行处理,以达到更加易读,更加方便扩展的一个最终目的。
在这里插入图片描述

其实还可以更进一步,如果每个颜色块代码,我们都拆分出一个函数,就会写出类似上面右侧风格的代码,每个数据来源都清晰可见,而且每个功能函数都可以在各个地方复用。

响应式系统

Vue 2 的响应式机制是通过 Object.defineProperty 来实现这个 API 的,其中包含两个方面,一是数据代理,二是数据劫持。此外,Vue 还使用了 Proxy,这两者看起来都像是对数据的读写进行拦截,但是 defineProperty 是拦截具体某个属性,Proxy 才是真正的代理。

如果大家有认真看过 Vue2 文档,在 Vue2 官方文档中有这么一句话“由于 JavaScript 的限制,Vue 不能检测数组和对象的变化。”

怎样去理解 Object.defineProperty(),你可以到 JavaScript | MDN 查看详细文档,并且有详细的使用。

Object.defineProperty() 最核心的作用就是通过为对象的某几个属性来去指定描述符的形式去监听对象中某几个属性的 get 和 set。

就因为这样的一个特性,因此,在下面的这几种场景之中,新的属性是没有办法通过 Object.defineProperty() 来去进行监测到的。

场景一:对于对象

下面的代码中,我们在一开始声明了一个 data 对象,在该对象中定义了一个属性 a,并赋值为 1。而如果通过 vm.b 的形式来为这个对象新增了一个属性 b,并且赋值为 2。那么这种 Object.defineProperty() 形式是没有办法监测到的,因此,b 属性并不是一个响应式。

let vm=new Vue({
  data:{
    a:1
  }
})
// mv.b 非响应式
vm.b=2

场景二:对于数组

而对于数组也是一样,如果通过 Array.push 这样的方法去给它添加数据,是没有问题的,万事大吉。但是,如果通过这种下标的形式数组重新赋值,或者通过 length 属性的形式给数组重新赋值,那么,同样也没有办法去监测到这样的变化。

let vm = new Vue({
  data:{
    arr:['a','b','c']
  }
})
//非响应式
vm.arr[1]='d' 
//非响应式
vm.arr.length='e'

这也是为什么在 Vue2 里面会存在着 Vue.set 方法的原因,这个方法就是为了向响应式数据中新增一个属性,并确保新的属性同样是响应式。

但是,虽然 在 Vue2 里面通过 Vue.set 方法来解决了这个非响应式的问题。其实这种情况一直都是不合理的。

为什么呢?因为 Vue.set 方法只是无意义的增加了我们的项目的复杂度而已,但是一直以来因为 Object.defineProperty() 这个 API 本身的限制,则一直没有办法去进行处理。

这个问题一直持续到了 Vue3 的发布,在 Vue3 里面摈弃掉了 Object.defineProperty(),而是通过了一个新的 Proxy 代理 API 来去处理了响应式的问题。

如何理解 Proxy,大家可以到 JavaScript | MDN 查看详细文档,详细地介绍 Proxy 如何使用。

它核心作用就是为对象去创建一个代理,从而实现一些基本的拦截操作和自定义操作,这里所指的拦截操作就是前面所提到的 get 和 set 对应操作。

通过 Proxy 就从根本上去解决了 Object.defineProperty() 所面临的这样的两个问题,这也是为什么 Vue3 里面就没有了 Vue.set 方法的原因。

全新的全家桶

为什么 Vue 被称之为是一个渐进式框架呢?就是因为对于 Vue 而言,它不仅仅是只有 Vue.js 这样的一个核心 JavaScript 库,它还有很多其他的周边库,比如 Vue-Router、Vuex 等等一些周边库存在,而这些周边库和 Vue.js 这个核心库一起共同组成了 Vue,这是我们 Vue 中最基础的知识。因此,在 Vue3 发布之后,它的这些周边库也会迎来一波新的更新。

而关于这些全家桶的一些更新内容,我们会在后面的课程中该大家去进行详细的讲解,在这里就不再去进行一些赘述了。

全新的 TS 的支持

这里的 TS 指的就是 TypeScript。如果大家关注过一些 Vue3 中代码的变化,是可以知道的 Vue3 使用 TypeScript 去进行代码的重构。重构的目的是为了防止随着应用的增长而产生许多潜在的运行时静态类型的错误。

而这意味着以后在 Vue 里面去使用 TypeScript,不需要借助其他的任何工具了。但是对于 TypeScript,有一点需要去提醒大家,虽然 Vue 对 TypeScript 进行了一个全新的支持,但是这并不代表着我们应该在任何情况下都无条件的去使用 TypeScript。

因为 TypeScript 主要的优势其实在于静态类型检查和环境声明,但同时这样的两个特性也会为我们的项目去增加非常高的复杂度。如果我们的项目需要使用到这两点特性的话,那么非常推荐你去使用 TypeScript。否则,你只是无谓的增加了项目的复杂度而已。

因此,决定我们使用哪一种技术的唯一条件就是我们的目标,而我们在当前的这个项目之中。在我们完成目标的基础之上,应该要做的就是寻找到最简单的一个实践方案,而不是找到一个最复杂的实践方案。

新一代工程化工具 Vite

严格来说,Vite 并不能算是 Vue3 里面的一个内容,只不过,在Vite 是跟随 Vue3 一起去进行了发布,并且热度又很广。

对于 Vite 来说,其实它是和 Webpack 一样的,也是一个前端的打包工具。而它区别于 Webpack 地方是它使用了基于原生 ES 模块所提供的一个特性。它基于原生的 ES 模块达到如速度快到惊人的热模块更新的能力。

对于 Vite 而言,现在它依然存在着一些问题,什么问题呢?因为 Vite 完全依赖于 ES Module,所以就导致它无法直接对 CommonJS 模块进行模块化的支持。如果在 Vite 里面想要去处理 CommonJS 的模块化支持,那么就必须采用依赖预构建的一种形式。这个在Vite 的官方文档中也有详细的介绍。

虽然 Vite 是一个全新的东西,尤大神非常的看好。但是,就目前我们国内的实际企业开发场景中,Vite 还不够稳定的足够支撑商用。

如果大家想要创建一个大型的商业级的应用的话,个人还是推荐更加成熟的 Webpack 解决方案,毕竟在商业的项目里面稳定是超过一切。

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

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

相关文章

Docker---Docker-compose 安装部署 zentao 禅道

Docker-compose 安装部署 zentao 禅道 目录Docker-compose 安装部署 zentao 禅道一、环境准备1.更换国内源2.拉取zentao的docker镜像3.关闭防火墙4.安装启动docker、docker-compose二、通过yml文件进行部署一、环境准备 1.更换国内源 CentOS7 Base源: wget -O /et…

技术男的春天:小姐姐求助暖男分析

时光荏苒,这个故事发生在4年前,那时候我头发可真厚,坐地铁也不用戴口罩。 小姐姐求助 友圈一位要做毕设的小姐姐在求助postman怎么用,我就帮她解答了一下。 我知道她并非计算机相关专业,所以很奇怪为什么要用postma…

web安全渗透

自己模拟的环境,要的私信 Web安全渗透 1、通过URL访问http://靶机IP/1,对该页面进行渗透测试,将完成后返回的结果内容作为flag值提交; 修改源码maxlength对应的数值,3+16=19输出的数值是两位数,然后修改完之输入

HTML+CSS+JS网页设计期末课程大作业—— 绿色化妆品HTML+CSS+JavaScript

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Windows搭建web站点:为站点配置二级子域名 2-2

在上一篇文章《Windows搭建Web站点:免费内网穿透发布至公网 1/2》中,我们成功通过cpolar将内网web站点发布到公网可访问,但免费使用cpolar所生成的域名是随机变化的(24小时后会变化),这只适合临时测试使用。…

Mysql SQL优化跟踪来看看是如何优化并决策使用哪个索引或者不适用索引

背景 使用索引字段进行筛选数据时,explain查询语句发现MySQL居然没有使用索引,产生疑问,因此决定调查清楚为什么会不用索引,而是走全表扫描 原因调查出的结果是当你要查询的数据量是连续又占整个表五分之一以上那就不会走索引了&a…

Java面试宝典.exe程序成功运行,经典 Java 万字笔记,查漏补缺,备战跳槽面试

现在 java 的面试真的卷到家了,面试前很有必要针对性的多刷题,大部分童鞋实战能力强,理论不行,面试前不做准备很吃亏。这里整理了很多常考面试题,希望对你有帮助。 耗时一个月,我把牛客网上最火的 Java 面…

ZMQ之共享键值缓存(克隆模式)

发布-订阅模式和无线电广播有些类似,在你收听之前发送的消息你将无从得知,收到消息的多少又会取决于你的接收能力。让人吃惊的是,对于那些追求完美的工程师来说,这种机器恰恰符合他们的需求,且广为传播,成为…

导出 txt文件 处理思路和实现流程

1.先看导出目标文件需要的字段都存不存在, 存在继续处理,不存在就添加。 例如,我这里需要在若依的用户表在添加一个银行账户数据, //银行卡号 private String accountNumber; public String getAccountNumber() { r…

Java程序员3个月从月薪6k涨到15k,你知道我是怎么过来的吗?

(一). 基础 1. Java 基本功 Java 入门(基础概念与常识) Java 语法 基本数据类型 方法(函数) 2. Java 面向对象 类和对象 面向对象三大特征 修饰符 接口和抽象类 其它重要知识点 3. Java 核心技术 集合 异常 多线程 文…

Python——协程(Coroutine),异步IO

目录 生成器(Generator) yield表达式的使用 生产者和消费者模型 ​编辑 yield from表达式 协程(Coroutine) asyncio.coroutine async/await 总结 由于GIL的存在,导致Python多线程性能甚至比单线程更糟。 于是出现了协程(Coroutine)这…

Arduino UNO通过PCF8574串行IIC接口驱动LCD1602/LCD2004液晶屏

LCD1602/2004液晶屏简介 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。可以显示2行每行16个字符,总共32个字符。字符型液晶显示模块是一种专门用于显示字母、数字和符号等的点阵式LCD,常用161,162,202和402等的模块。不…

Go编程项目实战教程

Go编程项目实战教程 在这个面向初学者的 Go 编程语言课程中,您将通过构建 11 个项目来提高您的 Go 编程技能 课程英文名:Learn Go Programming by Building 11 Projects – Full Course 此视频教程共21.0小时,中英双语字幕,画质…

数据之道读书笔记-07打造“数字孪生”的数据全量感知能力

数据之道读书笔记-07打造“数字孪生”的数据全量感知能力 在信息化时代构建的IT系统,基本上是功能化、烟囱化、封闭式的,只能给企业内部经过培训的专业人员使用,所有的决策数据和我们信任的IT系统基本都是靠人来录入数据。但是,人…

Android移动开发基础——实训项目:个人财务软件

目录 步骤 1. 项目计划 需求分析 程序流程图 2. 实现功能模块 2.1 登录模块 前提 软件:Android Studio开发工具、JDK1.8以上版本 目标:编写个人财务软件 步骤 (1)根据设计题目要求的指标,通过查阅有关资料…

某学生宿舍楼设计

目 录 1.建筑设计部分 1 1.1工程概况 1 1.2设计依据 2 1.3标高及建筑细部作法 2 1.4平面设计 2 1.4.1建筑方案设计 2 1.4.2建筑做法 4 1.4.3 建筑设计成果 6 2.结构设计部分 7 2.1结构平面设计 7 2.2构件截面尺寸的初步确定 8 2.3荷载统计 10 2.3.1楼屋面及卫生间恒活计算 10 2…

热加载技术:修改Python代码并实时查看结果 ⛵

💡 作者:韩信子ShowMeAI 📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 📘 本文地址:https://www.showmeai.tech/article-detail/406 📢 声明:版权所有&#xf…

基于MindSpore框架的道路场景语义分割方法研究

概述 本文以华为最新国产深度学习框架Mindspore为基础,将城市道路下的实况图片解析作为任务背景,以复杂城市道路进行高精度的语义分割为任务目标,对上述难处进行探究并提出相应方案,成功地在Cityscapes数据集上完成了语义分割任务…

vue3+ts做echarts做一个简单的折线渐变图

vue3做echarts做一个简单的折线渐变图 效果 代码&#xff1a; </template> <div><div class"date-change"><el-date-picker size"small" v-model"dateValue" value-format"YYYY-MM-DD" type"daterange&qu…

Leetcode 72. 编辑距离

最近在写dp问题的时候&#xff0c;写到这个经典题&#xff0c;对于里面三个转换方程没太懂&#xff0c;偶然在评论区找到一个非常非常清楚的解释&#xff0c;顺便就把这道题记录一下&#xff0c;加上自己的理解&#xff0c;方便日后查看! 对于这一类的dp习惯性的都初始化dp的大…