Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 概览

  • 响应式系统

    • Proxy对象代理
    • effect函数
    • ref和reactive
    • computed函数
      • 响应系统里的工具函数
    • runtime运行时

    • runtime-core

    • compiler编译

    • 《Vue3源码》笔记
    • 响应式系统
    东流
    2024-07-08
    目录

    computed函数

    # 概述

    vue3中的computed函数相当于vue2中的computed,也是一个用于创建计算属性的函数,计算属性是基于响应式数据派生出来的数据,它们会根据其依赖的响应式数据自动跟新

    # computed注意事项

    • 惰性求值:计算属性是惰性求值的,只有实际访问其值时才会执行计算函数

    • 自动依赖追踪:即其依赖的响应式数据发函俄国变化时,函数会被执行,计算属性会自动更新

    • 缓存:计算属性会缓存其返回的值

    # computed实现原理

    computed接受一个函数作为参数,内部通过ComputedRefImpl构造一个实例并返回

    # ComputedRefImpl类

    ComputedRefImpl类伪代码实现如下,其中会调用ReactiveEffect,生成一个effect实例,并挂载到this上,定义get和set方法,一般而言get方法会更实用,在其中分别调用triggerRefValue和triggerRefValue,用于触发依赖和收集依赖。

    class ComputedRefImpl {
      constructor(getter) {
        this.getter = getter;
        this.effect = new ReactiveEffect(
          () => getter(this._value),
          () => {
            triggerRefValue(this, this.effect._dirtyLevel === 2 ? 2 : 3);
          }
        );
      }
      get value() {
        const self = toRaw(this);
        if (
          (!self._cacheable || self.effect.dirty) &&
          shared.hasChanged(self._value, (self._value = self.effect.run()))
        ) {
          triggerRefValue(self, 4);
        }
        trackRefValue(self);
        if (self.effect._dirtyLevel >= 2) {
          triggerRefValue(self, 2);
        }
        return self._value;
      }
      set value(newValue) {
        this._setter(newValue);
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    编辑 (opens new window)
    上次更新: 2024/12/03, 14:43:37
    ref和reactive
    响应系统里的工具函数

    ← ref和reactive 响应系统里的工具函数→

    最近更新
    01
    GeoJSON
    05-08
    02
    Circle
    04-15
    03
    CircleMarker
    04-15
    更多文章>
    Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式