目录

  • 1. 组合式API简介
    • 1.1. 组合式API是为了实现关注点抽离
      • 1.1.1. 什么是关注点?
      • 1.1.2. 为什么需要关注点抽离?
      • 1.1.3. 组合式API是为了实现关注点抽离
  • 2. 组合式API
  • 3. 响应性API
    • 3.1. 响应性
    • 3.2. 副作用
    • 3.3. ref,reactive
    • 3.4. computed,watch,onMounted
  • 4. 深入
    • 4.1. Proxy
    • 4.2. get 和 set 方法
    • 4.3. 万物皆可“副作用”

本文重点在概念的理解,而不在具体代码原理的实现

1. 组合式API简介

1.1. 组合式API是为了实现关注点抽离

1.1.1. 什么是关注点?

简单地可以这么理解,关注点就是代码业务逻辑,因为我们写代码的时候倾向于把特定的逻辑功能点聚合在一起,也就是我们倾向于“关注这些功能点”,因此关注点可以理解为特定的代码业务逻辑

1.1.2. 为什么需要关注点抽离?

关注点抽离也称为关注点分离,这里称为抽离是强调功能的抽取聚合而不与分散的概念混淆。关注点抽离也就是特定的代码功能块逻辑的抽离,更有利于程序的开发,问题的定位,以及功能的聚合等,试想一下,如果不同的功能代码,离散地分布在不同地方,如果想修改或调试代码,是不是很麻烦?

1.1.3. 组合式API是为了实现关注点抽离

vue3可以使用组合式API实现关注点抽离,换句话说,如果使用一般的vue构建组件的方式,可能实现不了关注点抽离的问题

因为普通的vue定义组件的方式,是通过data,computed,watch,methods,mouted等选项来完成的,而这些选项可以理解为框架性的功能选项,而不是跟业务功能相关的选项,如果一个组件涉及多个功能逻辑,那么可能就不得不把一个完整的业务功能点分散在这些选项之中了
组合式API的出现正是为了解决这种问题,熟悉react的同学大致也想到了,这就类似react已经实现了的hook

2. 组合式API

  • 2.1. 组合式API通过setup(){}选项暴露,该选项函数返回值可以在模板和实例中被访问,具体用法可参考官方文档:Setup
  • 2.2. 组合式API可以理解为关注点抽离的入口,我们可以把之前分散在各个选项data,computed,watch,methods,mouted的功能代码抽离到setup里面,然后暴露出来
  • 2.3. 组合式API可以抽离代码,意味着setup就不把data,computed,watch,methods,mouted这些功能作为选项了,但是如何实现与这些选项相匹配的功能呢?vue3为此暴露了与之匹配的ref,reactive,computed,watch,watchEffect等方法以及onMounted等生命周期
  • 2.4. 利用ref,reactive,computed等接口可以把之前分散在各个选项的逻辑功能块组合到一起,也就是,我们把之前分散的关注点抽离到一个代码块了,实现了关注点抽离
  • 2.5. 这会导致另外一个问题,关注点抽离到setup后,又通过setup暴露,后面setup本身的代码量是不是会越来越多,为了解决这个问题,又可以进一步把相同的功能代码抽离到一个单独的文件中,详见文档:什么是组合式 API

3. 响应性API

3.1. 响应性

所谓响应性,官方文档是这样解释的:响应性是一种允许我们以声明式的方式去适应变化的编程范例。简单地可以理解为,具有响应性的数据,如果在某处地方被使用,这个数据如果发生了变化,那么使用的地方也会相应更新

例如,有一个数据a,然后b使用了数据a,如果a在某处发生变化了,会触发b使用a的地方的更新。如果还不理解,再具体一点,vue data 选项里定义的就是响应性的数据,你在模板中使用了这些数据,然后这些数据在某处发生了变化,你模板里面的数据是不是也会相应更新?这就是响应性。vue3 通过 Proxy 和依赖&副作用收集 实现这种响应性,相比起vue3的Proxy,vue2是使用defineProperty实现的。

响应性原理可参照官方文档:响应性原理

3.2. 副作用

关于副作用,官方文档是这么描述的:Vue 通过一个副作用 (effect) 来跟踪当前正在运行的函数。副作用是一个函数的包裹器,在函数被调用之前就启动跟踪。Vue 知道哪个副作用在何时运行,并能在需要时再次执行它。

文档说得有点抽象,可以这么简单地理解,副作用就是记录[使用了响应式数据的地方]且可能需要被重新执行的一种机制,在vue3里面体现为一个函数包裹器,里面便包裹了使用了响应式数据的地方。也就是说,如果我们跟踪了副作用依赖于哪些响应式数据,在这些数据做出了变化之后,我们便可以触发副作用的执行,达到更新的目的。

你可以发现,其实computed,watch,甚至使用了数据的模板,都可以理解为跟副作用相关,因为他们都依赖于某些响应式的数据。

3.3. ref,reactive

ref,reactive可以创建响应式的数据,可以理解为setup里面与原来data选项相对应的功能,一旦有地方使用到了这些数据,就会被包裹进副作用里,并在这些数据修改的时候运行副作用更新,具体可参考官方文档:响应性基础

3.4. computed,watch,onMounted

onMounted对应原来的mouted周期钩子,更多周期钩子可见:生命周期钩子
computed,watch对应原来的computed,watch选项,其实质就是副作用,包裹了使用了响应式数据的内容,并在合适的时机更新他们,更多参考:响应式计算和侦听

4. 深入

看了上面的内容,可能有人会说,我现在知道响应性数据是什么,副作用是什么,但是从响应式数据的定义到使用的数据更新到底发生了什么,还是不太明白,要明白这个过程,就需要深入理解响应式数据是如何定义及使用的

4.1. Proxy

响应式数据的定义使用了ES6的Proxy,Proxy可以简单地理解为数据代理器,通过get和set方法,可以代理数据的获取和修改行为

4.2. get 和 set 方法

vue3的实现是,一个数据通过Proxy代理之后,在get方法里面,加入track方法,该方法追踪副作用的依赖,例如有一个computed返回的结果是this.a+this.b,那么这个this.a+this.b就被包裹进副作用内,而这个副作用被记录为依赖于a和b,因为在get a和b的时候,执行了track方法

而在set方法内,加入了trigger方法,该方法用于在响应式数据被修改后,执行依赖于这些数据的副作用,还是上面的computed例子,当this.a='newValue’重新设置后,被set方法拦截执行,set内部有trigger方法,该方法找到依赖于这些数据的副作用this.a+this.b并执行更新,这时候computed返回值就会更新

4.3. 万物皆可“副作用”

除了computed,像watch,引用数据的模板,其实都是跟副作用相关,原理跟上面描述的一致,只是computed和watch是更新数据,模板还需要通过数据的变化更新vnodes,最后再更新真实的dom
更多可参考官方文档:深入响应性原理

附:响应式数据与副作用示意图:

属于自己的文字,理解,观点,欢迎交流

vue3 组合式API与响应性的概念理解和简析相关推荐

  1. vue3组合式api基础(常用)

    vue3组合式api基础(常用) 前言:vue3中尽量不要使用'this',最好使用组合式api(Composition API),如果使用uni-app的,vue3只支持ios>=10(201 ...

  2. Vue3组合式Api script setup模式中顶层使用await报Top-level ‘await‘ expressions are only allowed when the ‘module‘

    今天练习Vue3的Suspense组件的时候碰到在Vue3组合式Api script setup模式中顶层使用await时报错Eslint错误(能正常编译),错误提示是: Top-level 'awa ...

  3. Vue2选项式API和Vue3组合式API的区别

    文章目录 Vue2选项式API和Vue3组合式API的区别 响应式处理 组件生命周期 组件通讯 其他差异 编译器的变化 TypeScript 静态类型提升 Vue2选项式API与Vue3组合式API ...

  4. 关于Vue3组合式API(Composition API)的个人理解

    首先,关于组合式API现已有众多大佬发布了相关介绍及相关教程,但是个人在学习过程中还是花了比较多的时间去理解 " 组合式API " 这个概念. 因为目前搜索引擎排的比较前面的文章其 ...

  5. vue3组合式api

    文章目录 组合式API介绍 什么是组合式 API? 为什么要有组合式 API? 更好的逻辑复用 更灵活的代码组织 Option Api Option Api的缺陷 Composition Api 更好 ...

  6. Vue3 组合式API初体验

    目录 一.背景 二.什么是组合式API(Composition API ) 组合式API全景 为什么要引入组合式API `mixins` 的方式 域插槽的方式 组合式API的方式 结论 组合式API存 ...

  7. Vue3 -- 组合式API

    组合式API 组合式api(Composition API)算是vue3对我们开发者来说非常有价值的一个api更新,我们先不关注具体语法,先对它有一个大的感知 1. composition vs op ...

  8. vue3 组合式API使用第1篇-保证学得会

    本文已参与「新人创作礼」活动,一起开启掘金创作之路 1. 了解组合式API 1.1 选项式API特点 讲解 vue3 的组合式 API 之前,先来看看传统的选项式 API 的特点 一个非常明显的优点就 ...

  9. 谈谈vue3组合式api的优势

    vue2: options API 配置式 使用传统Options API(配置式API)中,新增或者修改一个需求,就需要分别在data,methods,computed里修改 . vue3: com ...

最新文章

  1. DASH流媒体MPD文件存储
  2. 苹果App Icon的问题
  3. C++改变基类成员在派生类中的访问属性
  4. 训练的神经网络不工作?一文带你跨过这37个坑
  5. 【渝粤题库】陕西师范大学500006 算法语言 作业
  6. 小看--单例设计模式
  7. Android:通过Intent传递对象、Parcelable
  8. 微信小程序之WebSocket
  9. nodemcu http get无法使用IP的问题
  10. compose yaml规则
  11. 如何构建一个自己的代理ip池
  12. 从单体式架构迁移到微服务架构,简述java程序的运行原理
  13. 黑暗森林:V神和Paradigm联创都在玩的三体游戏(dark forest)
  14. 18.Excel vba开发-计算个人所得税
  15. 小程序从云服务器获取视频,小程序从云服务器获取视频代码
  16. 又整理了一些面试相关的:视频教程,面试经验,简历模板,写简历的技巧等
  17. NPOI导出word,NPOI导出word表格,NPOI复制table表格 XWPFDocument中XWPFTable
  18. linux内核snat分析,(十)洞悉linux下的Netfilteriptables:网络地址转换原理之SNAT
  19. CLIP 改进工作串讲(下)
  20. UE4中的世界光照如何设置?

热门文章

  1. python就业前景不好_Python就业前景好不好?为什么学完Python找不到工作?
  2. C#之浅析面向对象编程思想(一)
  3. 2017年牛客网校招模拟二
  4. [转载]陌陌上市前夜遭网易声明三宗罪:求丁磊放过唐岩
  5. 腾讯日赚10亿 人均年薪84万
  6. jmap 文件解析_jmap,jhat分析内存
  7. linux上传替换文件报错,linux上搭建nginx+ftp,实现文件的上传与访问
  8. java之静态代理模式
  9. 禁止小米路由器访问QQ视频
  10. 文明3地图之一--两个大岛