From 47ddf986021dff8de68b0da72787e53a6c19de4c Mon Sep 17 00:00:00 2001 From: inottn Date: Thu, 5 Jun 2025 10:19:48 +0800 Subject: [PATCH] fix(runtime-core): unset old ref during patching when new ref is absent (#12900) fix #12898 --- .../__tests__/rendererTemplateRef.spec.ts | 31 +++++++++++++++++++ packages/runtime-core/src/renderer.ts | 2 ++ 2 files changed, 33 insertions(+) diff --git a/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts b/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts index a7ae7a06bf..7803826e3d 100644 --- a/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts +++ b/packages/runtime-core/__tests__/rendererTemplateRef.spec.ts @@ -179,6 +179,37 @@ describe('api: template refs', () => { expect(el.value).toBe(null) }) + it('unset old ref when new ref is absent', async () => { + const root1 = nodeOps.createElement('div') + const root2 = nodeOps.createElement('div') + const el1 = ref(null) + const el2 = ref(null) + const toggle = ref(true) + + const Comp1 = { + setup() { + return () => (toggle.value ? h('div', { ref: el1 }) : h('div')) + }, + } + + const Comp2 = { + setup() { + return () => h('div', { ref: toggle.value ? el2 : undefined }) + }, + } + + render(h(Comp1), root1) + render(h(Comp2), root2) + + expect(el1.value).toBe(root1.children[0]) + expect(el2.value).toBe(root2.children[0]) + + toggle.value = false + await nextTick() + expect(el1.value).toBe(null) + expect(el2.value).toBe(null) + }) + test('string ref inside slots', async () => { const root = nodeOps.createElement('div') const spy = vi.fn() diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 56f9759bc5..a57be791a4 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -485,6 +485,8 @@ function baseCreateRenderer( // set ref if (ref != null && parentComponent) { setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2) + } else if (ref == null && n1 && n1.ref != null) { + setRef(n1.ref, null, parentSuspense, n1, true) } } -- 2.47.2