• 第三十二节——组合式API计算属性+watch


    一、计算属性

    接受一个 getter 函数,并根据 getter 的返回值返回一个不可变的响应式 ref 对象。也就是说,如果我们观察的是

    ref或者reactive数据,返回后的数据不能在修改

    1. <template>
    2. <div>{{ plusOne }}</div>
    3. </template>
    4. <script setup>
    5. import { computed } from "vue";
    6. // 定义一个计算属性
    7. const count = ref(1)
    8. const plusOne = computed(() => count.value + 1)
    9. // 但是注意computed返回的数据是不可变数据
    10. // plusOne.value++ // 错误
    11. </script>

    如果我们想后面在修改则可以传入 getset 函数的对象可用来创建可写的 ref 对象

    1. <template>
    2. <div>{{ plusOne }}</div>
    3. </template>
    4. <script setup>
    5. import { computed, ref } from "vue";
    6. const count = ref(1)
    7. const plusOne = computed({
    8. /**
    9. * 劫持数据,每次获取的时候,都会自动给数据+1
    10. * 比如 现在template里面的plusOne就是1000
    11. * 注意要有返回值,返回的值就是我们拿到的结果
    12. * 如果说对get不想做操作那么就直接把我们要返回的值返回
    13. */
    14. get: () => {
    15. return 1000
    16. },
    17. /**
    18. * 每次修改的时候数据-1
    19. * 不需要返回值 这个val就是我们plusOne的值
    20. * 如果说不想劫持则可以直接默认赋值
    21. */
    22. set: val => {
    23. count.value = val - 1
    24. }
    25. })
    26. plusOne.value += 1
    27. /**
    28. * 这个值是1000,以为我们在劫持了他的数据修改
    29. * 所以我们+1 然后 数据再去件-1,所以相当于没变
    30. */
    31. console.log(plusOne.value)
    32. </script>

    二、watchEffect

    为了根据响应式状态自动应用重新应用副作用,我们可以使用 watchEffect 函数。它立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数,简单来说,我们写的函数,会立即执行一次,然后每次里面的数据发生变化后再出发该函数

    1. <template>
    2. <div>{{ count }}</div>
    3. </template>
    4. <script setup>
    5. import { watchEffect, ref, reactive } from "vue";
    6. const count = ref(1)
    7. const info = reactive({ name: '张三' })
    8. /**
    9. * 创建后会立即执行,然后每次里面使用的响应式数据发生改变的时候
    10. * 注意是响应式数据
    11. * 该函数会再再次执行
    12. */
    13. watchEffect(() => {
    14. console.log(count.value)
    15. console.log(info.name)
    16. })
    17. setTimeout(() => {
    18. count.value += 1
    19. }, 100)
    20. setTimeout(() => {
    21. info.name = '李四'
    22. }, 2000)
    23. </script>

    三、watch

    watch用来监听特定的数据源,并在回调函数中执行。

    1. <template>
    2. <div>{{ count }}</div>
    3. </template>
    4. <script setup>
    5. import { watch, ref, reactive } from "vue";
    6. const count = ref(1)
    7. const count2 = ref(2)
    8. const info = reactive({ name: '张三' })
    9. /**
    10. * 监听原始数据类型变化时,可以直接传入
    11. * 数据里面可以跟多个值,有一个值变化就会触发这个方法
    12. * 对应的返回值可以使用数据解构出来
    13. */
    14. watch([count, count2], ([newVal, newVal2], [oldVal, oldVal2]) => {
    15. console.log(newVal, oldVal)
    16. console.log(newVal2, oldVal2)
    17. })
    18. setTimeout(() => {
    19. count.value += 1
    20. count2.value += 2
    21. }, 1000)
    22. </script>

    监听对象类型的数据,并且可以传入第三个参数,是个对象deep 是否深度观察immediate立即执行一次

    1. <template>
    2. <div>哈哈哈</div>
    3. </template>
    4. <script setup>
    5. import { watch, ref, reactive } from "vue";
    6. const info = reactive({ name: '张三' })
    7. const info2 = reactive({ name: '李四' })
    8. /**
    9. * 观察一个或者多个对象的变化,要使用函数的方式返回那个对象
    10. * 如果对象中有属性发生变化就会触发方法
    11. * 注意:watch默认是惰性的,如果观察对象需要手动在第三个参数加{deep: true}
    12. */
    13. const stop = watch([() => info, () => info2],
    14. ([newVal, oldVal], [newVal2, oldVal2]) => {
    15. console.log(newVal, oldVal)
    16. console.log(newVal2, oldVal2)
    17. }, {
    18. deep: true,
    19. immediate: true
    20. })
    21. setTimeout(() => {
    22. info.name = '王五'
    23. info2.name = '王五2'
    24. }, 1000)
    25. // 如果想移除监听则可以拿到watch的返回,并在合适的时候调用它
    26. stop()
    27. </script>

    四、watch和watchEffect的区别

    1、watchEffect不需要指定监听的属性,自动收集依赖;watch需要指定监听的属性

    2、watchEffect拿不到旧值;watch可以拿到旧值

    3、watchEffect在组件第一次就会收集依赖,然后收集到的依赖发生了变化,回调才会再次执行;watch就不是了。一开始就指定了依赖。

  • 相关阅读:
    MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(3)-系统数据集合设计
    华为悦盒ec6108v9c使用ADB卡刷Linux(Ubuntu)
    供应链应该帮助品牌做到可持续发展
    6.7-7.2 读书笔记
    测试面试-经典测试场景
    C#使用委托/跨线程给控件赋值
    【图像处理】:Otsu算法最大类间方差法(大津算法:附源码)
    每日一题——输入一个日期,输出它是该年的第几天
    Android 11适配
    Java手写斐波那契数列算法和斐波那契数列算法应用拓展案例
  • 原文地址:https://blog.csdn.net/weixin_57017198/article/details/134264600