fix(runtime-core/refs): handle multiple merged refs for dynamic component with vnode

fix #2078
This commit is contained in:
Evan You
2020-09-14 15:33:38 -04:00
parent 313dd06065
commit 612eb6712a
3 changed files with 86 additions and 11 deletions

View File

@@ -6,7 +6,8 @@ import {
nextTick,
defineComponent,
reactive,
serializeInner
serializeInner,
shallowRef
} from '@vue/runtime-test'
// reference: https://vue-composition-api-rfc.netlify.com/api.html#template-refs
@@ -325,4 +326,43 @@ describe('api: template refs', () => {
await nextTick()
expect(spy.mock.calls[1][0]).toBe('p')
})
// #2078
test('handling multiple merged refs', async () => {
const Foo = {
render: () => h('div', 'foo')
}
const Bar = {
render: () => h('div', 'bar')
}
const viewRef = shallowRef<any>(Foo)
const elRef1 = ref()
const elRef2 = ref()
const App = {
render() {
if (!viewRef.value) {
return null
}
const view = h(viewRef.value, { ref: elRef1 })
return h(view, { ref: elRef2 })
}
}
const root = nodeOps.createElement('div')
render(h(App), root)
expect(serializeInner(elRef1.value.$el)).toBe('foo')
expect(elRef1.value).toBe(elRef2.value)
viewRef.value = Bar
await nextTick()
expect(serializeInner(elRef1.value.$el)).toBe('bar')
expect(elRef1.value).toBe(elRef2.value)
viewRef.value = null
await nextTick()
expect(elRef1.value).toBeNull()
expect(elRef1.value).toBe(elRef2.value)
})
})