1.3 响应式系统(一)
1.响应式系统与副作用函数
副作用函数:
function effect(){ document.body.innerText=obj.text }
effect函数的执行会直接或间接影响到其它函数的执行,其改变body的文本内容,此时就成effect函数产生了副作用。
当副作用函数effect执行时,会触发obj.text的读取操作,修改obj.text的值时,会触发obj.text的设置操作。想象一下,我们可以拦截一个对象的读取和设置操作,例如将函数effect拦截到一个桶里,当obj.text设置时再把effect函数取出来执行。为了实现这种方法,可以添加对对象数据的代理,使用Proxy来实现。
//存储副作用函数的桶 const bucket=new Set(); //原始数据 const data={text:'hello'} //对原始数据的代理 const obj=new Proxy(data,{ get(target,key){ //添加副作用函数 bucket.add(effect) //返回属性值 return target[key] }, set(target,key,newval){ //设置属性值 target[key]=newval; //取出副作用函数来执行 bucket.forEach(fn=>fn()) return true } })
function effect(){ document.body.innerText=obj.text } effect() setTimeout(()=>{obj.text='hello tom'},1000)
执行代码,在一秒后,就能实现效果。
浙公网安备 33010602011771号