当前位置: 首页 > Web前端 > vue.js

Vue设计与实现一书中有一个vue设计与实现cleanup

时间:2023-03-31 20:31:27 vue.js

的例子,如下constdata={ok:true,text:"helloworld}constobj=newProxy(data,{...})effect(()=>{document.body.innerHtml=obj.ok?obj.text:"not";})在这段代码中,当obj.ok为真时,document.body会被赋值给obj.text的值,也就是说这会触发两个get,分别是obj.ok和obj.text。当我们将obj.ok赋值为false时,会触发这个函数,但不会执行obj.text的get操作.我们想要的是当obj.text改变的时候,这个函数不会被触发,但是现在text的deps也收集了这个函数的依赖。这时候我们就需要用到清理功能了。cleanup函数的实现思路我们在执行副作用函数的时候,可以将其从相关依赖集合中删除。执行副作用函数后,会进行依赖收集。首先,需要修改效果函数和轨道函数。functioneffect(fn){consteffectFn=()=>{cleanup(effectFn)activeEffect=effectFnfn()}effectFn.deps=[]effectFn()}functiontrack(target,key){if(!activeEffect)返回让depsMap=bucket.get(target)if(!depsMap){bucket.set(target,(depsMap=newMap))}letdeps=depsMap.get(key)if(!deps){depsMap.set(key,(deps=newSet()))}deps.add(activeEffect)//将effectFn关联的依赖集合添加到effectFn的deps中activeEffect.deps.push(deps)}在这段代码中,会进行cleanup操作当执行effectFn函数时,然后fn的执行和cleanup函数的实现如下functioncleanup(effectFn){for(i=0;i