From 1fde49c0f57cc50fedf91366a274c9759d1d9a39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=83=B3?= <32740073+GRPdream@users.noreply.github.com> Date: Wed, 1 Feb 2023 17:02:03 +0800 Subject: [PATCH] fix(runtime-core): fix keep-alive cache prune logic on vnodes with same type but different keys (#7510) fix #7355 --- packages/runtime-core/src/components/KeepAlive.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/components/KeepAlive.ts b/packages/runtime-core/src/components/KeepAlive.ts index c3c2b63e455..d5813f90e09 100644 --- a/packages/runtime-core/src/components/KeepAlive.ts +++ b/packages/runtime-core/src/components/KeepAlive.ts @@ -12,7 +12,8 @@ import { cloneVNode, isVNode, VNodeProps, - invokeVNodeHook + invokeVNodeHook, + isSameVNodeType } from '../vnode' import { warn } from '../warning' import { @@ -193,7 +194,7 @@ const KeepAliveImpl: ComponentOptions = { function pruneCacheEntry(key: CacheKey) { const cached = cache.get(key) as VNode - if (!current || cached.type !== current.type) { + if (!current || !isSameVNodeType(cached, current)) { unmount(cached) } else if (current) { // current active instance should no longer be kept-alive. @@ -230,7 +231,7 @@ const KeepAliveImpl: ComponentOptions = { cache.forEach(cached => { const { subTree, suspense } = instance const vnode = getInnerChild(subTree) - if (cached.type === vnode.type) { + if (cached.type === vnode.type && cached.key === vnode.key) { // current instance will be unmounted as part of keep-alive's unmount resetShapeFlag(vnode) // but invoke its deactivated hook here