对 vue3 的响应式实现感到困惑
Confused about vue3's reactive implementation
在vue3的reactive implementation中,有一个effectStack。
我不明白为什么它必须是一个堆栈,如果效果会在 push() 之后立即 pop()?
effectStack的长度是否可以大于1?
try {
enableTracking()
effectStack.push(effect)
activeEffect = effect
return fn()
} finally {
effectStack.pop()
resetTracking()
activeEffect = effectStack[effectStack.length - 1]
}
我相信这是因为效果可以触发其他效果。
例如,一个computed
属性可能会呼唤另一个computed
属性,在这种情况下,两个效果将同时是运行时间。在那种情况下,'inner' 效果在 'outer' 效果完成之前运行,并且需要针对正确的效果注册依赖项。 'outer' 效果暂时隐藏,而 'inner' 效果是 运行,然后在完成时恢复。
因此,如果对 fn
的调用导致递归回到同一段代码,则长度可以大于 1。
在vue3的reactive implementation中,有一个effectStack。 我不明白为什么它必须是一个堆栈,如果效果会在 push() 之后立即 pop()? effectStack的长度是否可以大于1?
try {
enableTracking()
effectStack.push(effect)
activeEffect = effect
return fn()
} finally {
effectStack.pop()
resetTracking()
activeEffect = effectStack[effectStack.length - 1]
}
我相信这是因为效果可以触发其他效果。
例如,一个computed
属性可能会呼唤另一个computed
属性,在这种情况下,两个效果将同时是运行时间。在那种情况下,'inner' 效果在 'outer' 效果完成之前运行,并且需要针对正确的效果注册依赖项。 'outer' 效果暂时隐藏,而 'inner' 效果是 运行,然后在完成时恢复。
因此,如果对 fn
的调用导致递归回到同一段代码,则长度可以大于 1。