一、computed

在前面我们讲解过计算属性computed:当我们的某些属性是依赖其他状态时,我们可以使用计算属性来处理

  • 在前面的Options API中,我们是使用computed选项来完成的;
  • 在Composition API中,我们可以在 setup 函数中使用 computed 方法来编写一个计算属性;

如何使用computed呢?

  • 方式一:接收一个getter函数,并为 getter 函数返回的值,返回一个不变的 ref 对象;

  • 方式二:接收一个具有 get 和 set 的对象,返回一个可变的(可读写)ref 对象;

二、侦听数据的变化

在前面的Options API中,我们可以通过watch选项来侦听data或者props的数据变化,当数据变化时执行某一些操作。

在Composition API中,我们可以使用watchEffect和watch来完成响应式数据的侦听;

  • watchEffect用于自动收集响应式数据的依赖;
  • watch需要手动指定侦听的数据源;

三、watchEffect

当侦听到某些响应式数据变化时,我们希望执行某些操作,这个时候可以使用 watchEffect。

我们来看一个案例:

  • 首先,watchEffect传入的函数会被立即执行一次,并且在执行的过程中会收集依赖
  • 其次,只有收集的依赖发生变化时,watchEffect传入的函数才会再次执行;

四、watchEffect的停止侦听

如果在发生某些情况下,我们希望停止侦听,这个时候我们可以获取watchEffect的返回值函数,调用该函数即可。

比如在上面的案例中,我们age达到20的时候就停止侦听:

五、watchEffect清除副作用

什么是清除副作用呢?
比如在开发中我们需要在侦听函数中执行网络请求,但是在网络请求还没有达到的时候,我们停止了侦听器,或者侦听器侦听函数被再次执行了。
那么上一次的网络请求应该被取消掉,这个时候我们就可以清除上一次的副作用;

在我们给watchEffect传入的函数被回调时,其实可以获取到一个参数:onInvalidate

  • 当副作用即将重新执行 或者 侦听器被停止 时会执行该函数传入的回调函数;
  • 我们可以在传入的回调函数中,执行一些清除工作;

六、setup中使用ref

在讲解 watchEffect执行时机之前,我们先补充一个知识:在setup中如何使用ref或者元素或者组件?

  • 其实非常简单,我们只需要定义一个ref对象,绑定到元素或者组件的ref属性上即可;

七、watchEffect的执行时机

默认情况下,组件的更新会在副作用函数执行之前:

  • 如果我们希望在副作用函数中获取到元素,是否可行呢?

我们会发现打印结果打印了两次:

  • 这是因为setup函数在执行时就会立即执行传入的副作用函数,这个时候DOM并没有挂载,所以打印为null;
  • 而当DOM挂载时,会给title的ref对象赋值新的值,副作用函数会再次执行,打印出来对应的元素;

八、调整watchEffect的执行时机

如果我们希望在第一次的时候就打印出来对应的元素呢?

  • 这个时候我们需要改变副作用函数的执行时机;
  • 它的默认值是pre,它会在元素 挂载 或者 更新 之前执行;
  • 所以我们会先打印出来一个空的,当依赖的title发生改变时,就会再次执行一次,打印出元素;

我们可以设置副作用函数的执行时机:

flush 选项还接受 sync,这将强制效果始终同步触发。然而,这是低效的,应该很少需要。

九、Watch的使用

watch的API完全等同于组件watch选项的Property:

  • watch需要侦听特定的数据源,并在回调函数中执行副作用;
  • 默认情况下它是惰性的,只有当被侦听的源发生变化时才会执行回调;

与watchEffect的比较,watch允许我们:

  • 懒执行副作用(第一次不会直接执行);
  • 更具体的说明当哪些状态发生变化时,触发侦听器的执行;
  • 访问侦听状态变化前后的值;

十、侦听单个数据源

watch侦听函数的数据源有两种类型:

  • 一个getter函数:但是该getter函数必须引用可响应式的对象(比如reactive或者ref);

  • 直接写入一个可响应式的对象,reactive或者ref(比较常用的是ref);
    注意:
    如果传入的是reactive响应式对象,取到的值也是reactive对象


    注意:
    如果传入的是reactive响应式对象,想要解构reactive对象,将其变成普通对象,可以用以下方法:

    注意:
    如果传入的是ref响应式对象,取到的值直接就是value,而不是ref对象

十一、侦听多个数据源

侦听器还可以使用数组同时侦听多个源:

十二、侦听响应式对象

如果我们希望侦听一个数组或者对象,那么可以使用一个getter函数,并且对可响应对象进行解构:

十三、watch的选项

如果我们希望侦听一个深层的侦听,那么依然需要设置 deep 为true:

  • 也可以传入 immediate 立即执行;



Vue3 Composition API(二)——computed、watchEffect、setup中使用ref相关推荐

  1. Vue3 Composition API(一)——setup、reactive、ref、readonly

    一.Options API的弊端 在Vue2中,我们编写组件的方式是Options API: Options API的一大特点就是在对应的属性中编写对应的功能模块: 比如data定义数据.method ...

  2. setup中使用ref

    目录 一.问题 二.解决方法 三.总结 一.问题 1.在选项式API中可以直接用 this.$refs.xxx来引用template中的DOM元素. 但是在组合式API setup中没有this,该如 ...

  3. Vue3 Composition API(三)——生命周期钩子、Provide函数 和 Inject函数、封装Hook案例、setup顶层编写方式

    一.生命周期钩子 我们前面说过 setup 可以用来替代 data . methods . computed .watch 等等这些选项,也可以替代 生命周期钩子. 那么setup中如何使用生命周期函 ...

  4. Vue3 Composition API如何替换Vue Mixins

    想在你的Vue组件之间共享代码?如果你熟悉Vue 2 则可能知道使用mixin,但是新的Composition API 提供了更好的解决方案. 在本文中,我们将研究mixins的缺点,并了解Compo ...

  5. vue3 Composition ApI总结

    1.setup setup中不能用this,因为setup是在实例被完全初始化之前的执行的,而在实例被初始化之前是没有this的, 它不能调用实例上的方法,但是实例上的方法可以调用它 2.响应式处理r ...

  6. Vue3学习之第三节:setup()中使用计算属性

    vue2的方式写computed: 代码片段: data() {return {num1: 0,num2: 0,};},computed: {result() {return parseInt(thi ...

  7. vue3.0 - Composition API

    一. 介绍 >使用传统的option配置方法写组件的时候问题,随着业务复杂度越来越高,代码量会不断的加大:由于相关业务的代码需要遵循option的配置写到特定的区域,导致后续维护非常的复杂,同时 ...

  8. Vue3.0 Composition API与Vue2.x 使用的 Options API

    Vue3.0 所采用的 Composition API 与 Vue2.x 使用的 Options API 有什么不同 开始之前 Composition API 可以说是Vue3最大的特点,那么为什么要 ...

  9. js 表单设计器_准备迎接Vue3,使用Vue Composition API生成干净可扩展的表单

    表单是前端开发中最棘手的部分之一,您可能会在其中发现很多混乱的代码. Vue.js 2之类的基于组件的框架在提高前端代码的可伸缩性方面做了很多工作,但是形式问题仍然存在. 在本教程中,我将向您展示新的 ...

最新文章

  1. 手机QQ重构移动社交市场
  2. 在SQL 2005中用T-SQL插入中文数据时出现的问号或乱码的解决方案[转]
  3. Java模式(适配器模式)
  4. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
  5. jmeter+ant+jenkins的自动化接口测试
  6. ADSL、SRA、HDSL
  7. 小程序入门学习15---数据库实战01
  8. 华为云发布国内首个 AI 模型市场,加速企业 AI 应用落地
  9. 带aidl文件的应用程序在android平台源码中的编译
  10. linux shell 编程之变量总结
  11. 基于51单片机的智能温控风扇
  12. android11.0 Launcher3 高端定制之抽屉列表隐藏指定APP图标
  13. C#基础 连接数据库
  14. java金额比较大小_JAVA中精确计算金额BigDecimal
  15. java使用pinyin4j实现汉字到拼音转换
  16. 【每日英文】2021.7.23
  17. NUIST 9th 校赛 P4
  18. LinuxC++:网络编程(一)最原始服务端及客户端代码实现和函数释义
  19. 直击|杨杰出任中国移动董事长 尚冰今年64岁或退休
  20. 谷歌被墙,怎样给谷歌浏览器加入迅雷下载插件

热门文章

  1. 学成在线--15.课程计划查询
  2. Centos7更新 SQLite3至版本3.29.0
  3. 2000服务器文件共享,Win2000 Server实现对共享文件的监控
  4. 移动端导出excel_连载系列【4】Excel开发移动端quot;APPquot;
  5. 云电脑是什么_云电脑和我们现在平时用的电脑有什么区别?
  6. tornado学习笔记day07-同步与异步
  7. 智能外呼系统相关资料总结
  8. 机器学习之数理统计与参数估计的相关知识总结
  9. 博客地址 RSS地址
  10. tl wn322g linux驱动下载,怎样才能装好tl_wn322G+V2.0版USB无线网卡的Linux驱动