]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): fix keep-alive cache prune logic on vnodes with same type but...
author李想 <32740073+GRPdream@users.noreply.github.com>
Wed, 1 Feb 2023 09:02:03 +0000 (17:02 +0800)
committerGitHub <noreply@github.com>
Wed, 1 Feb 2023 09:02:03 +0000 (04:02 -0500)
fix #7355

packages/runtime-core/src/components/KeepAlive.ts

index c3c2b63e4556d79386a1d27c81626e4f8eeb45b2..d5813f90e097321d20ccc78acabf4770f9f11c21 100644 (file)
@@ -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