Skip to content

Commit 47ddf98

Browse files
authored
fix(runtime-core): unset old ref during patching when new ref is absent (#12900)
fix #12898
1 parent e8d8f5f commit 47ddf98

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

packages/runtime-core/__tests__/rendererTemplateRef.spec.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,37 @@ describe('api: template refs', () => {
179179
expect(el.value).toBe(null)
180180
})
181181

182+
it('unset old ref when new ref is absent', async () => {
183+
const root1 = nodeOps.createElement('div')
184+
const root2 = nodeOps.createElement('div')
185+
const el1 = ref(null)
186+
const el2 = ref(null)
187+
const toggle = ref(true)
188+
189+
const Comp1 = {
190+
setup() {
191+
return () => (toggle.value ? h('div', { ref: el1 }) : h('div'))
192+
},
193+
}
194+
195+
const Comp2 = {
196+
setup() {
197+
return () => h('div', { ref: toggle.value ? el2 : undefined })
198+
},
199+
}
200+
201+
render(h(Comp1), root1)
202+
render(h(Comp2), root2)
203+
204+
expect(el1.value).toBe(root1.children[0])
205+
expect(el2.value).toBe(root2.children[0])
206+
207+
toggle.value = false
208+
await nextTick()
209+
expect(el1.value).toBe(null)
210+
expect(el2.value).toBe(null)
211+
})
212+
182213
test('string ref inside slots', async () => {
183214
const root = nodeOps.createElement('div')
184215
const spy = vi.fn()

packages/runtime-core/src/renderer.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,8 @@ function baseCreateRenderer(
485485
// set ref
486486
if (ref != null && parentComponent) {
487487
setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2)
488+
} else if (ref == null && n1 && n1.ref != null) {
489+
setRef(n1.ref, null, parentSuspense, n1, true)
488490
}
489491
}
490492

0 commit comments

Comments
 (0)