Skip to content

计算属性的运行机制

  • 计算属性在 template 中也不需要访问 value 因为也拥有了 __v_isRef 属性
  • 首先执行 trackRefValue 对计算属性本身进行依赖收集
    • 这时候 activeEffect 是组件副作用函数对应的 effect 对象
  • 会判断 dirty 属性 默认是 true 所以更新的时候会把 _dirtry 设置成 false
    • 接着执行计算属性内部的 effect 对象的 run 函数 进一步执行 computed getter

运行机制

图片

计算属性的两个特点

延时计算

当我们访问计算属性的时候 才会执行 computed getter 函数进行计算

缓存

  • 内部会缓存上次的计算结果 value 只有 _dirtry 为 true 的时候才会重新计算
  • 如果访问计算属性时_dirtry 为 false 直接返回 缓存的 value
ts
export function computed<T>(
  getter: ComputedGetter<T>,
  debugOptions?: DebuggerOptions
): ComputedRef<T>
export function computed<T>(
  options: WritableComputedOptions<T>,
  debugOptions?: DebuggerOptions
): WritableComputedRef<T>
export function computed<T>(
  getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>,
  debugOptions?: DebuggerOptions,
  isSSR = false
) {
  let getter: ComputedGetter<T>
  let setter: ComputedSetter<T>

  const onlyGetter = isFunction(getterOrOptions)
  if (onlyGetter) {
    getter = getterOrOptions
    setter = __DEV__
      ? () => {
          console.warn('Write operation failed: computed value is readonly')
        }
      : NOOP
  } else {
    getter = getterOrOptions.get
    setter = getterOrOptions.set
  }

  const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR)

  if (__DEV__ && debugOptions && !isSSR) {
    cRef.effect.onTrack = debugOptions.onTrack
    cRef.effect.onTrigger = debugOptions.onTrigger
  }

  return cRef as any
}

Welcome to the site