vue3学习记录(新特性)
总概
1) 性能提升
- 打包大小减少 41%
- 初次渲染快 55%,更新渲染快 133%
- 内存减少 54%
- 使用 Proxy 代替 defineProperty 实现数据响应式
- 重写虚拟 DOM 的实现和 Tree-Shaking
2) 新增特性
- Composition (组合) API
- setup
- ref 和 reactive
- computed 和 watch
- 新的生命周期函数
- provide 与 inject
- 新组件
- Fragment - 文档碎片
- Teleport - 瞬移组件的位置
- Suspense - 异步加载组件的 loading 界面
- 其它 API 更新
- 全局 API 的修改
- 将原来的全局 API 转移到应用对象
- 模板语法变化
详解
1) setup
- 新的 option,所有的组合 API 函数都在此使用,只在初始化时执行一次
- 函数如果返回对象,对象中的属性或方法,模板中可以直接使用
2) ref
- 作用:定义一个数据的响应式
- 语法:const xxx = ref(initValue):
- 创建一个包含响应式数据的引用(reference)对象
- js 中操作数据:xxx.value
- 模板中操作数据:不需要.value
- 一般用来定义一个基本类型的响应式数据
3) reactive
- 作用: 定义多个数据的响应式
- const proxy = reactive(obj): 接收一个普通对象然后返回该普通对象的响应式代理器对象
- 响应式转换是“深层的”:会影响对象内部所有嵌套的属性
- 内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据都是响应式的
4) 比较 Vue2 与 Vue3 的响应式(重要)
vue2 的响应式
- 核心:
- 对象:通过 defineProperty 对对象的已有属性值的读取和修改进行劫持(监视/拦截)
- 数组:通过重写数组更新数组一系列更新元素的方法来实现元素修改的劫持
- 问题:
- 对象直接新添加的属性或删除已有属性,界面不会自动更新
- 直接通过下标替换元素或更新 length,界面不会自动更新 arr[1] = {}
Vue3 的响应式
- 核心:
- 通过 Proxy(代理):拦截对 data 任意属性的任意(13 种)操作,包括属性值的读写,属性的添加,属性的删除等...
- 通过 Reflect(反射):动态对被代理对象的相应属性进行特定的操作
- 文档:
5) setup 细节
- setup 执行的时机
- 在 beforeCreate 之前执行(一次),此时组件对象还没有创建
- this 是 undefined,不能通过 this 来访问 data/computed/methods / props
- 其实所有的 composition API 相关回调函数中也都不可以
- setup 的返回值
- 一般都返回一个对象:为模板提供数据,也就是模板中可以直接使用此对象中的所有属性/方法
- 返回对象中的属性会与 data 函数返回对象的属性合并成为组件对象的属性
- 返回对象中的方法会与 methods 中的方法合并成功组件对象的方法
- 如果有重名,setup 优先
- 注意:
- 一般不要混合使用:methods 中可以访问 setup 提供的属性和方法,但在 setup 方法中不能访问 data 和 methods
- setup 不能是一个 async 函数:因为返回值不再是 return 的对象,而是 promise,模板看不到 return 对象中的属性数据
- setup 的参数
- setup(props,context) / setup(props,{attrs,slots,emit})
- props:包含 props 配置声明且传入了的所有属性的对象
- attrs:包含没有在 props 配置中声明的属性的对象,相当于 this.$attrs
- slots:包含所有传入的插槽内容的对象,相当于 this.$slots
- emit:用来分发自定义事件的函数,相当于 this.$emit
6) reactive 与 ref-细节
- 是 Vue3 的 composition API 中 2 个最重要的响应式 API
- ref 用来处理基本类型数据,reactive 用来处理对象(递归深度响应式)
- 如果用 ref 对象/数组,内部会自动将对象/数组转换为 reactive 的代理对象
- ref 内部:通过给 value 属性添加 getter/setter 来实现对数据的劫持
- reactive 内部:通过使用 Proxy 来实现对对象内部所有数据的劫持,并通过 Reflect 操作对象内部数据
- ref 的数据操作:在 js 中要.value,在模板中不需要(内部解析模板时会自动添加.value)
7) 计算属性与监视
- computed 函数:
- 与 computed 配置功能一致
- 只有 getter
- 有 getter 和 setter
- watch 函数
- 与 watch 配置功能一致
- 监视指定的一个或多个响应式数据,一旦数据变化,就自动执行监视回调
- 默认初始时不执行回调,但可以通过配置 immediate 为 true,来指定初始时立即执行第一次
- 通过配置 deep 为 true,来指定深度监视
- watchEffect 函数
- 不用直接指定要监视的数据,回调函数中使用的哪些响应式数据就监视哪些响应式数据
- 默认初始时就会执行第一次,从而可以收集需要监视的数据
- 监视数据发生变化时回调
8) 生命周期
与 2.x 版本生命周期相对应的组合式 API
- beforeCreate -> 使用 setup()
- created -> 使用 setup()
- beforeMount -> onBeforeMount
- mounted -> onMounted
- beforeUpdate -> onBeforeUpdate
- updated -> onUpdated
- beforeDestroy -> onBeforeUnmount
- destroyed -> onUnmounted
- errorCaptured -> onErrorCaptured
新增的钩子函数
组合式 API 还提供了以下调试钩子函数:
- onRenderTracked
- onRenderTriggered
09) 自定义 hook 函数
- 使用 Vue3 的组合 API 封装的可复用的功能函数
- 自定义 hook 的作用类似于 vue2 中的 mixin 技术
- 自定义 Hook 的优势:很清楚复用功能代码的来源,更清楚易懂
- 需求 1:收集用户鼠标点击的页面坐标
1 import { ref, onMounted, onUnmounted } from 'vue'
2 /*
3 收集用户鼠标点击的页面坐标
4 */
5 export const useMousePosition=()=> {
6 // 初始化坐标数据
7 const x = ref(-1)
8 const y = ref(-1)
9
10 // 用于收集点击事件坐标的函数
11 const updatePosition = (e: MouseEvent) => {
12 x.value = e.pageX
13 y.value = e.pageY
14 }
15
16 // 挂载后绑定点击监听
17 onMounted(() => {
18 document.addEventListener('click', updatePosition)
19 })
20
21 // 卸载前解绑点击监听
22 onUnmounted(() => {
23 document.removeEventListener('click', updatePosition)
24 })
25
26 return { x, y }
27 }
28
29 <template>
30 <div>
31 <h2>x: {{ x }}, y: {{ y }}</h2>
32 </div>
33 </template>
34
35 <script>
36 import { ref,setup } from 'vue'
37 /* 在组件中引入并使用自定义hook
38 自定义hook的作用类似于vue2中的mixin技术
39 自定义Hook的优势:很清楚复用功能代码的来源, 更清楚易懂*/
40
41 import useMousePosition from './hooks/useMousePosition'
42
43 export default {
44 const { x, y } = useMousePosition()
45 return {
46 x,
47 y
48 }
49 }
50 </script>
vue3学习记录(新特性)的更多相关文章
- 通过10个实例小练习,快速熟练 Vue3.0 核心新特性
Vue3.0 发 beta 版都有一段时间了,正式版也不远了,所以真的要学习一下 Vue3.0 的语法了. GitHub 博客地址: https://github.com/biaochenxuying ...
- HTML5学习记录1-新特性
新特性 HTML5 中的一些有趣的新特性: 1. 用于绘画的 canvas 元素 2. 用于媒介回放的 video 和 audio 元素 3. 对本地离线存储的更好的支持 4. 新的特殊内容元素,比如 ...
- PHP的学习--Traits新特性
在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits. Traits 是一种为类似 PHP 的 ...
- redis学习记录1 特性与优点
1.存储结构:字符串.散列.列表.集合.有序集合. redis存储结构的优势:数据在redis中的储存方式和其在程序中的储存方式相近:redis对不同数据类型提供非常方便的操作方式,如使用集合类型储存 ...
- 【Java学习笔记之二十八】深入了解Java8新特性
前言: Java8 已经发布很久了,很多报道表明java8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java 8 ...
- Java学习之==>Java8 新特性详解
一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...
- java8 新特性精心整理
前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特 ...
- java8 新特性精心整理(全)
前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特 ...
- 2020你还不会Java8新特性?
Java8(1)新特性介绍及Lambda表达式 前言: 跟大娃一块看,把原来的电脑拿出来放中间看视频用 --- 以后会有的课程 难度 深入Java 8 难度1 并发与netty 难度3 JVM 难度4 ...
随机推荐
- 我与Apache DolphinScheduler的成长之路
关于 Apache DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache ...
- java-流的使用完结与异常处理机制
1.1java.io.objectInputStream 对象输入流:用于将一组字节(通过对象输出流写出对象而转换的一组字节)读取并转换为对应的对象.对象输出流将对象写出时转换为一组字节的过程,称为: ...
- SSM整合,快速新建javaWeb项目
整合前需要了解: spring和springmvc包扫描的注意事项 Spring applicationContext.xml (父容器),SpringMVC springmvc-servlet.xm ...
- 网站制作工具之EditPlus的使用
这里分享网站制作教程所使用到的软件,我个人开发使用的是EditPlus和Dreamweaver这两款软件.在百度搜索一下这两个软件,安装好后就可以使用了. EditPlus的使用方法 EditPlus ...
- 一个包搞定中文数据集: datasetstore
工作中,总是要使用各种中文数据集,每次使用数据集都要花费不少的时间进行寻找,写预处理代码,结合不同的模型和框架做出相应的处理.有的时候好不容易找到合适的数据集,但是却因为网络问题,无法下载,下载了很长 ...
- springboot 集成 docsify 实现随身文档
需求分析 文档可以和项目一起进行版本管理 文档可以在线访问 文档可以与springboot项目集成,不需要分开部署 MarkDown支持 文档跟随,打包jar也可以访问 技术选型 对于网上已有的方案, ...
- C/C++内存泄漏检测方法
1. 内存泄漏 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 2. 检测代码 使用链 ...
- Gitea 与 Jenkins 的集成实践,打造你的专属 CI/CD 系统
前言 Gitea 是一个用于代码托管的轻量级单体程序,它能与现有的经典应用集成,诸如代码分析工具 SonarQube.持续集成工具 Drone.Jenkins 以及用于工单管理的客户端插件(VSCod ...
- Python数据科学手册-前言
读Python数据科学手册 笔记 系列 数据科学 data science https://img2022.cnblogs.com/blog/2827305/202205/2827305-202205 ...
- centos系统安装MySQL8
使用yum仓库安装MySQL8 1.查看centos系统版本 # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 2.下载并安 ...