Open wangnan0916 opened 2 years ago
@wangnan0916 我照着书上敲 activeEffect 和effectStack 的实现 咋和你这个不一样? 不过我倒是发现一个问题,可能我还没有看到后面,就是effectStack 每次pop.最后一次肯定是undefined。那么activeEffect 也会是undefined 那么书上53页track 第一行代码, if(!activeEffect) return 岂不是get不到值了
嵌套这里确实有bug,外层更新数据时,会触发内层重新执行effect函数,这时内层的cleanup(effectFn),并不会清掉上一次绑定副作用函数
在进行嵌套定义effect时,如果多次修改外部effect中使用的响应式数据,会间接调用内部effect。
effect(fn)
会将fn
包装为effectFn
obj.foo
进行重新绑定时,会导致内部的依赖再次绑定bucket
的数据结构中的Set无法对effectFn
进行去重,也就导致注册多个重复的依赖。程序的输出结果为:
在对内部的响应式数据进行修改时,触发了三个
effectFn
,其中有初始化的1个,两次对obj.foo
进行修改时,间接添加的effectFn
。 在我个人看来,应该只需要执行一个effectFn
,而不是三个,不知道是本意如此,还是意外的BUG。 如果是BUG,我想到了一个不是很好解决的方法:通过将函数转为string来判断是否为相同的函数。例如:涉及修改的代码如下:
以上是个人看法,如有错误,还请霍老师指正😳。