Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(hmr/keep-alive): fix error in reload component (#7042) #7049

Merged
merged 5 commits into from Nov 10, 2022

Conversation

zhangzhonghe
Copy link
Member

fix #7042

@zhangzhonghe
Copy link
Member Author

@yyx990803 你好,我发现这个 PR 与 #6809 重复了,并且你已经合并了 6809。但是我有一个疑问,就是 6809 的修复并不能通过我提供的测试,热更新的时候它没有调用旧组件的unmounted生命周期函数。

我觉得被KeepAlive包裹的组件热更新的时候应该把旧的组件给卸载了,因为新的组件是重新挂载的。不知道我对不对,望赐教。(●'◡'●)

@edison1105
Copy link
Member

@zhangzhonghe
预期的行为是:当KeepAlive卸载的时候才卸载其内部组件。
我觉得热更新时是否调用内部组件的unmounted没那么重要,毕竟只是开发环境下的行为。

@zhangzhonghe
Copy link
Member Author

@zhangzhonghe 预期的行为是:当KeepAlive卸载的时候才卸载其内部组件。 我觉得热更新时是否调用内部组件的unmounted没那么重要,毕竟只是开发环境下的行为。

是的。但是修改后的新组件是会调用 mounted 的,这可能产生一些问题。比如,如果用户在 mounted 阶段注册了一些监听器且需要在 unmounted 阶段销毁的话,就会有问题,因为旧组件的 unmounted 没有被调用,也就无法销毁,如果这种情况下频繁热更新的话可能会导致内存泄漏。

@edison1105
Copy link
Member

@zhangzhonghe 预期的行为是:当KeepAlive卸载的时候才卸载其内部组件。 我觉得热更新时是否调用内部组件的unmounted没那么重要,毕竟只是开发环境下的行为。

是的。但是修改后的新组件是会调用 mounted 的,这可能产生一些问题。比如,如果用户在 mounted 阶段注册了一些监听器且需要在 unmounted 阶段销毁的话,就会有问题,因为旧组件的 unmounted 没有被调用,也就无法销毁,如果这种情况下频繁热更新的话可能会导致内存泄漏。

有道理。

@zhangzhonghe zhangzhonghe changed the title fix(hmr): avoid errors when updating KeepAlive slot component (#7042) fix(hmr/keep-alive): fix error in reload component (#7042) Nov 9, 2022
@zhangzhonghe
Copy link
Member Author

有道理,不过位运算的清理用-=不太稳妥,用 a &= ~b 会好一些

我是参考的这里的代码:

function resetShapeFlag(vnode: VNode) {
let shapeFlag = vnode.shapeFlag
if (shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE) {
shapeFlag -= ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE
}
if (shapeFlag & ShapeFlags.COMPONENT_KEPT_ALIVE) {
shapeFlag -= ShapeFlags.COMPONENT_KEPT_ALIVE
}
vnode.shapeFlag = shapeFlag
}

@yyx990803 yyx990803 merged commit a54bff2 into vuejs:main Nov 10, 2022
@yyx990803
Copy link
Member

确实,保证 unmount 是必要的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

keepAlive with Dynamic Components setup hmr error
3 participants