computed&&lazy

副作用函数effect:它的执行间接或者直接的影响了其他函数的执行。
effect会立即执行传递给它的副作用函数,但是这样很消耗性能,在需要的时候再执行,将它变为lazy的。

懒计算lazy

computed的执行会返回一个对象,只有读取对象的value,才会执行副作用函数

function computed(getter){
  const effectFn = effect(getter,{
  lazy: true
  })

  const obj = {
    // 在读取对象时,才执行effectFn
    get value (){
      return effectFn()
    }
  }
}

对值缓存

如果值发生变化,则取消缓存。
scheduler:调度器函数,会在响应式数据发生变化时执行。

function computed(getter){
    let value //储存缓存的值
    let dirty = true //决定是否使用缓存的值(false),还是重新计算值(true)。

    const effectFn=(getter,{
        lazy:true,
        scheduler(){
            dirty = true //在计算属性的值发生变化时,重新设置为dirty
        }
    })

    const obj = {
        get value(){
            if(dirty){
               value = effectFn() //重新计算值或者第一次计算值
               dirty=false
            }
            return value
        }
    }
    return obj 
}

发生effect嵌套,调用track追踪

对于计算属性的getter来讲,getter只会收集computed内部的effect,如果计算属性作用于另一个effect,就会发生effect嵌套。

function computed(getter){
    let value //储存缓存的值
    let dirty = true //决定是否使用缓存的值(false),还是重新计算值(true)。

    const effectFn=(getter,{
        lazy:true,
        scheduler(){
            dirty = true //在计算属性的值发生变化时,重新设置为dirty
            trigger(obj,'value')
        }
    })

    const obj = {
        get value(){
            if(dirty){
               value = effectFn() //重新计算值或者第一次计算值
               dirty=false
            }
            return value
            // 读取value时,手动调用track
            track(obj,'value')
        }
    }
    return obj 
}
posted @ 2022-10-13 11:04  pocoui  阅读(43)  评论(0)    收藏  举报