From 1a7f5d76b6baedae294fd141b4eb062bb2a0bfd7 Mon Sep 17 00:00:00 2001 From: daiwei Date: Mon, 5 Sep 2022 20:33:04 +0800 Subject: [PATCH 1/4] fix(runtime-core): v-memo work with v-if --- packages/runtime-core/src/helpers/withMemo.ts | 3 +++ packages/runtime-core/src/renderer.ts | 5 +++++ packages/runtime-core/src/vnode.ts | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/packages/runtime-core/src/helpers/withMemo.ts b/packages/runtime-core/src/helpers/withMemo.ts index 97fbad31fb9..9515891b2ec 100644 --- a/packages/runtime-core/src/helpers/withMemo.ts +++ b/packages/runtime-core/src/helpers/withMemo.ts @@ -15,6 +15,9 @@ export function withMemo( // shallow clone ret.memo = memo.slice() + + ret.cleanMemoCache = () => cache[index] = undefined + return (cache[index] = ret) } diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index d06c6858415..6a21aebde09 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -2116,6 +2116,11 @@ function baseCreateRenderer( setRef(ref, null, parentSuspense, vnode, true) } + // #6593 should clean memo cache when unmount + if (vnode.cleanMemoCache) { + vnode.cleanMemoCache() + } + 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 617bdf7ad58..9bab0e7f4ec 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 clean v-memo cache + */ + cleanMemoCache?: Function /** * @internal __COMPAT__ only */ From a0a5afae7413c1f4e624419db56cce8c1a1efc4d Mon Sep 17 00:00:00 2001 From: daiwei Date: Mon, 5 Sep 2022 21:15:03 +0800 Subject: [PATCH 2/4] test: add test case --- .../runtime-core/__tests__/helpers/withMemo.spec.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/runtime-core/__tests__/helpers/withMemo.spec.ts b/packages/runtime-core/__tests__/helpers/withMemo.spec.ts index f4f356dea4f..32f89b1d8e9 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 () => { From 50126cad2ae9604a91273694e5d9fe817de57324 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 03:51:36 +0000 Subject: [PATCH 3/4] [autofix.ci] apply automated fixes --- packages/runtime-core/src/helpers/withMemo.ts | 6 +++--- packages/runtime-core/src/renderer.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/runtime-core/src/helpers/withMemo.ts b/packages/runtime-core/src/helpers/withMemo.ts index 9515891b2ec..6f31182663b 100644 --- a/packages/runtime-core/src/helpers/withMemo.ts +++ b/packages/runtime-core/src/helpers/withMemo.ts @@ -15,9 +15,9 @@ export function withMemo( // shallow clone ret.memo = memo.slice() - - ret.cleanMemoCache = () => cache[index] = undefined - + + ret.cleanMemoCache = () => (cache[index] = undefined) + return (cache[index] = ret) } diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 6a21aebde09..e498c56fc2a 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -2116,8 +2116,8 @@ function baseCreateRenderer( setRef(ref, null, parentSuspense, vnode, true) } - // #6593 should clean memo cache when unmount - if (vnode.cleanMemoCache) { + // #6593 should clean memo cache when unmount + if (vnode.cleanMemoCache) { vnode.cleanMemoCache() } From b0617e5a330a5d208e71997998c282572fe67cb9 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 7 Jun 2024 17:26:42 +0800 Subject: [PATCH 4/4] refactor: use index instead of function --- packages/runtime-core/src/component.ts | 2 +- packages/runtime-core/src/helpers/withMemo.ts | 3 +-- packages/runtime-core/src/renderer.ts | 5 +++-- packages/runtime-core/src/vnode.ts | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index f2ca0464142..70a3716a3e3 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 6f31182663b..72ef814eefa 100644 --- a/packages/runtime-core/src/helpers/withMemo.ts +++ b/packages/runtime-core/src/helpers/withMemo.ts @@ -15,8 +15,7 @@ export function withMemo( // shallow clone ret.memo = memo.slice() - - ret.cleanMemoCache = () => (cache[index] = undefined) + ret.memoIndex = index return (cache[index] = ret) } diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index e498c56fc2a..2a35a5e1925 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -2110,6 +2110,7 @@ function baseCreateRenderer( shapeFlag, patchFlag, dirs, + memoIndex, } = vnode // unset ref if (ref != null) { @@ -2117,8 +2118,8 @@ function baseCreateRenderer( } // #6593 should clean memo cache when unmount - if (vnode.cleanMemoCache) { - vnode.cleanMemoCache() + if (memoIndex != null) { + parentComponent!.renderCache[memoIndex] = undefined } if (shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE) { diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index 9bab0e7f4ec..7abd45c7fa5 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -229,9 +229,9 @@ export interface VNode< */ memo?: any[] /** - * @internal clean v-memo cache + * @internal index for cleaning v-memo cache */ - cleanMemoCache?: Function + memoIndex?: number /** * @internal __COMPAT__ only */