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
}

浙公网安备 33010602011771号