如存在三元运算符时,怎么处理
const data = { text: 'hello world',ok:true}
effect(function effectFn(){document.body.innerText = obj.ok ? obj.text : 'not'
})
解决方案:每次执行副作用 函数,可以先把它从所有与之关联的依赖集合中删除。当副作用函数执行完后,会重新建立关系。
let activeEffect
function effect(fn){const effectFn = ()=>{cleanup(effectFn)activeEffect = effectFnfn()}effectFn.deps = []effectFn()
}
function cleanup(effectFn){for(let i=0; i< effectFn.deps.length; i++){const deps = effectFn.deps[i]deps.delete(effectFn)}effectFn.deps.length = 0
}
const bucket = new WeakMap()
const data = { text: 'hello world',ok:true}
const obj = new Proxy(data,{get(target,key){track(target,key)return target[key]},set(target,key,newValue){console.log('bucket:',bucket)target[key] = newValuetrigger(target,key)return true}
})
function track(target,key){if(!activeEffect) return target[key]let depsMap = bucket.get(target)if(!depsMap){bucket.set(target,(depsMap = new Map()))}let deps = depsMap.get(key)if(!deps){depsMap.set(key,(deps = new Set()))}deps.add(activeEffect)activeEffect.deps.push(deps)
}
function trigger(target,key){const depsMap = bucket.get(target)if(!depsMap) return trueconst effects = depsMap.get(key)const effectsToRun = new Set(effects)effectsToRun.forEach(effectFn => effectFn())
}
effect(function effectFn(){document.body.innerText = obj.ok ? obj.text : 'not'
})
setTimeout(()=>{obj.text = 'hello vue3'
},1000)setTimeout(()=>{obj.ok = false
},3000)