diff --git a/packages/runtime-core/__tests__/helpers/withMemo.spec.ts b/packages/runtime-core/__tests__/helpers/withMemo.spec.ts
index f4f356dea..32f89b1d8 100644
--- a/packages/runtime-core/__tests__/helpers/withMemo.spec.ts
+++ b/packages/runtime-core/__tests__/helpers/withMemo.spec.ts
@@ -148,6 +148,17 @@ describe('v-memo', () => {
// should update
await nextTick()
expect(el.innerHTML).toBe(`
3 3
`)
+
+ vm.ok = true
+ await nextTick()
+ vm.ok = false
+ await nextTick()
+ expect(el.innerHTML).toBe(`3 3
`)
+
+ vm.y++
+ // should update
+ await nextTick()
+ expect(el.innerHTML).toBe(`4 3
`)
})
test('on v-for', async () => {
diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts
index f2ca04641..70a3716a3 100644
--- a/packages/runtime-core/src/component.ts
+++ b/packages/runtime-core/src/component.ts
@@ -322,7 +322,7 @@ export interface ComponentInternalInstance {
* after initialized (e.g. inline handlers)
* @internal
*/
- renderCache: (Function | VNode)[]
+ renderCache: (Function | VNode | undefined)[]
/**
* Resolved component registry, only for components with mixins or extends
diff --git a/packages/runtime-core/src/helpers/withMemo.ts b/packages/runtime-core/src/helpers/withMemo.ts
index 97fbad31f..72ef814ee 100644
--- a/packages/runtime-core/src/helpers/withMemo.ts
+++ b/packages/runtime-core/src/helpers/withMemo.ts
@@ -15,6 +15,8 @@ export function withMemo(
// shallow clone
ret.memo = memo.slice()
+ ret.memoIndex = index
+
return (cache[index] = ret)
}
diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts
index d06c68584..2a35a5e19 100644
--- a/packages/runtime-core/src/renderer.ts
+++ b/packages/runtime-core/src/renderer.ts
@@ -2110,12 +2110,18 @@ function baseCreateRenderer(
shapeFlag,
patchFlag,
dirs,
+ memoIndex,
} = vnode
// unset ref
if (ref != null) {
setRef(ref, null, parentSuspense, vnode, true)
}
+ // #6593 should clean memo cache when unmount
+ if (memoIndex != null) {
+ parentComponent!.renderCache[memoIndex] = undefined
+ }
+
if (shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE) {
;(parentComponent!.ctx as KeepAliveContext).deactivate(vnode)
return
diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts
index 617bdf7ad..7abd45c7f 100644
--- a/packages/runtime-core/src/vnode.ts
+++ b/packages/runtime-core/src/vnode.ts
@@ -228,6 +228,10 @@ export interface VNode<
* @internal attached by v-memo
*/
memo?: any[]
+ /**
+ * @internal index for cleaning v-memo cache
+ */
+ memoIndex?: number
/**
* @internal __COMPAT__ only
*/