• 重学 vue3 中的 computed


    computed() 计算属性

    接受一个 getter 函数,返回一个只读的 响应式 ref 对象
    该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。

    创建一个只读的计算属性 ref:

    const count = ref(1)
    const doubleCount = computed(() => count.value * 2);
    
    console.log(doubleCount.value) // 2
    
    doubleCount.value++ // 错误
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建一个可写的计算属性 ref:

    const count = ref(1)
    const doubleCount = computed({
      get: () => count.value * 2,
      set: (val) => {
        // val doubleCount.value = 5 赋值的值,也就是5
        count.value = val - 1
      }
    })
    
    // 只有computed计算出来的值,被赋值时,computed中的set属性定义的函数,才会被执行
    doubleCount.value = 5
    console.log(count.value) // 4
    console.log(doubleCount.value) // 8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    计算属性的特性(缓存性,自动更新依赖性)

    计算属性值会基于其响应式依赖被缓存

    Vue 的计算属性会自动追踪响应式依赖,一个计算属性仅会在其响应式依赖更新时才重新计算。

    基于响应式依赖,自动更新计算

    const count = ref(1)
    const plusOne = computed(() => count.value + 1)
    
    count.value++ // computed依赖的响应式数据发生了变化
    console.log(plusOne.value) // 3
    
    • 1
    • 2
    • 3
    • 4
    • 5

    基于响应式依赖,computed 不会自动更新

    let count = 1;
    const doubleCount = computed(() => count * 2);
    
    console.log(doubleCount.value); // 2
    
    count++;
    console.log(doubleCount.value); // 2
    
    count = count * 2;
    console.log(doubleCount.value); // 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意!!注意!!注意!!

    computed 属性在 Vue 中是惰性计算的。这意味着它不会在定义时立即执行计算,而是在你首次访问 computed 属性的值时才会进行计算。
    计算的结果会被缓存,除非其依赖的响应式数据发生变化,否则在后续的访问中会直接使用缓存的值,不会重新计算。

    let count = 1;
    const doubleCount = computed(() => count * 2);
    
    count++;
    
    count = count * 2;
    // 首次访问 doubleCount computed 属性的值时才会进行计算。
    console.log(doubleCount.value); // 8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    let count = 1;
    const doubleCount = computed(() => count * 2);
    // 首次访问
    console.log(doubleCount.value); // 2
    
    count++;
    // 之后无论 count 怎么变化,doubleCount 都不会发生变化了
    console.log(doubleCount.value); // 2
    
    count = count * 2;
    // 之后无论 count 怎么变化,doubleCount 都不会发生变化了
    console.log(doubleCount.value); // 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    computed 计算属性 最佳实践

    Getter 不应有副作用

    计算属性的 getter 应只做计算而没有任何其他的副作用,这一点非常重要,请务必牢记。
    举例来说,不要改变其他状态、不要在 getter 中做异步请求或者更改 DOM!
    一个计算属性的声明中描述的是如何根据其他值派生一个值。因此 getter 的职责应该仅为计算和返回该值。

    避免直接修改计算属性值

    从计算属性返回的值是派生状态。可以把它看作是一个“临时快照”,每当源状态发生变化时,就会创建一个新的快照。
    更改快照是没有意义的,因此计算属性的返回值应该被视为只读的,并且永远不应该被更改。
    应该更新它所依赖的源状态以触发新的计算。

  • 相关阅读:
    .Net&Web前端-大三-零食系统-零食管理
    海量数据处理方法归纳
    【数据结构】线性表与顺序表
    通达OA漏洞分析合集
    ActiveMQ-基础知识
    [solidity]合约调用合约
    R语言dplyr包select函数删除dataframe数据中的以指定字符串开头的数据列(变量)
    云计算与大数据 第13章 云操作系统OpenStack习题带答案
    比较器应用之一_窗口比较器/极限比较器
    【计算机网络笔记】TCP/IP参考模型基本概念,包括五层参考模型
  • 原文地址:https://blog.csdn.net/qq_40893035/article/details/137859015