总概

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的新特性的更多相关文章

  1. vue3.0新特性以及进阶路线

    Vue3.0新特性/改动 新手学习路线  ===> 起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要 ...

  2. Vue3.0新特性

    Vue3.0新特性 Vue3.0的设计目标可以概括为体积更小.速度更快.加强TypeScript支持.加强API设计一致性.提高自身可维护性.开放更多底层功能. 描述 从Vue2到Vue3在一些比较重 ...

  3. 尝鲜 vue3.x 新特性 - CompositionAPI

    0. 基础要求 了解常见的 ES6 新特性 ES6 的导入导出语法 解构赋值 箭头函数 etc... 了解 vue 2.x 的基本使用 组件 常用的指令 生命周期函数 computed.watch.r ...

  4. 简单梳理下 Vue3 的新特性

    在 Vue3 测试版刚刚发布的时候,我就学习了下 Composition API,但没想到正式版时隔一年多才出来,看了一下发现还是增加了不少新特性的,在这里我就将它们一一梳理一遍. 本文章只详细阐述 ...

  5. Vue3的新特性及相关的Composition API使用

    首先 创建项目 Vue3 Vue3 相较于Vue2 的6大亮点: 1 性能快. 2 按需编译 体积更小 3 提供了组合API 类似于react 的React Hooks 4 更好的Ts支持 5 暴露了 ...

  6. vue3.x新特性之setup函数,看完就会用了

    最近有小伙伴跟我聊起setup函数,因为习惯了vue2.x的写法导致了,setup用起来觉得奇奇怪怪的,在一些api混编的情况下,代码变得更加混乱了,个人觉得在工程化思想比较强的团队中使用setup确 ...

  7. 通过10个实例小练习,快速熟练 Vue3.0 核心新特性

    Vue3.0 发 beta 版都有一段时间了,正式版也不远了,所以真的要学习一下 Vue3.0 的语法了. GitHub 博客地址: https://github.com/biaochenxuying ...

  8. Vue3 新特性

    一.vue3 为什么要重写 两个主要原因考虑重写vue新版本主要功能: 1.主流浏览器对新的JavaScript语言特性的普遍支持. 2.当前Vue代码库随着时间的推移而暴露出来的设计和体系架构问题. ...

  9. react 16.8版本新特性以及对react开发的影响

    Facebook团队对社区上的MVC框架都不太满意的情况下,开发了一套开源的前端框架react,于2013年发布第一个版本. react最开始倡导函数式编程,使用function以及内部方法React ...

随机推荐

  1. dpdk读字节,却触发了两次tlp

    在通过vfio框架透传设备到vm中,并且在vm中运行dpdk的驱动. 我们发现,dpdk偶尔的一次pread 2字节,却触发了两次tlp. 原因在于: do_io_rw { else if (fill ...

  2. 漂亮简洁的PHP导航源码-蘑菇导航

    蘑菇导航 蘑菇导航是根据SimpleWebNavigation修改而来的一个php网址导航.支持php8,支持左侧锚点,支持自定义fontawesome图标. 可以作为群组导航.图床导航.vps导航等 ...

  3. 【java】基础1-字符串、堆、栈、静态与引用类型

    /*结论:1,一般变量(int,float,boolean..)使用==比较,引用类型(String,int[],对象)使用equals比较.2,一般的变量存放在栈中,new出来的对象都存放在堆中,字 ...

  4. 避免jquery多次监听事件

    jQuery.event.dispatch 事件分发监听源码简单理解是将绑定的事件放入队列后进行监听,如果对一个事件多次绑定(on或者bind),事件会重复添加到队列等待jq监听,这样会导致很大资源消 ...

  5. cmake 入门笔记

    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16667896.html 1. cmake 是什么? 这些 ...

  6. 搭建Elasitc stack集群需要注意的日志问题

    文章转载自:https://blog.csdn.net/u013613428/article/details/84943577 {{uploading-image-736853.png(uploadi ...

  7. k8s ingress-nginx 使用 snippet 添加自定义配置 (比如:新增请求头)

    比如在有些时候我们需要在 server 里或者 location 里添加一些参数,例如添加包体大小限制.添加跨域配置.添加自定义header.处理响应header等等.遇到这些需求的时候,我们开始怀念 ...

  8. 一条命令查看docker容器的ip地址

    docker inspect --format='{{.NetworkSettings.IPAddress}}' ID/container_name

  9. 迁移阿里云上的ECS操作说明

    背景: 1.公司测试服务器快要到期了,但是续费太贵,就想用另一个阿里云账号下的服务器作为测试服务器. 2.测试服务器原在阿里云账号A下,要迁移到阿里云账号B下 3.该测试服务器有一个系统盘和俩数据盘 ...

  10. traefik的80和443端口占用进一步分析

    上一篇文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/14990065.html 建议先看上一篇文章,才更容易理解这篇 1.traefik的deployment ...