fix(runtime-core/template-ref): named ref in v-for regression fix (#5118)

close #5116
close #5447
close #5525
This commit is contained in:
lidlanca 2022-04-12 03:28:40 -04:00 committed by GitHub
parent 7efb9dba30
commit cee1eafb4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 0 deletions

View File

@ -442,4 +442,59 @@ describe('api: template refs', () => {
await nextTick() await nextTick()
expect(mapRefs()).toMatchObject(['2', '3', '4']) expect(mapRefs()).toMatchObject(['2', '3', '4'])
}) })
test('named ref in v-for', async () => {
const show = ref(true);
const list = reactive([1, 2, 3])
const listRefs = ref([])
const mapRefs = () => listRefs.value.map(n => serializeInner(n))
const App = {
setup() {
return { listRefs }
},
render() {
return show.value
? h(
'ul',
list.map(i =>
h(
'li',
{
ref: 'listRefs',
ref_for: true
},
i
)
)
)
: null
}
}
const root = nodeOps.createElement('div')
render(h(App), root)
expect(mapRefs()).toMatchObject(['1', '2', '3'])
list.push(4)
await nextTick()
expect(mapRefs()).toMatchObject(['1', '2', '3', '4'])
list.shift()
await nextTick()
expect(mapRefs()).toMatchObject(['2', '3', '4'])
show.value = !show.value
await nextTick()
expect(mapRefs()).toMatchObject([])
show.value = !show.value
await nextTick()
expect(mapRefs()).toMatchObject(['2', '3', '4'])
})
}) })

View File

@ -91,6 +91,9 @@ export function setRef(
if (!isArray(existing)) { if (!isArray(existing)) {
if (_isString) { if (_isString) {
refs[ref] = [refValue] refs[ref] = [refValue]
if (hasOwn(setupState, ref)) {
setupState[ref] = refs[ref]
}
} else { } else {
ref.value = [refValue] ref.value = [refValue]
if (rawRef.k) refs[rawRef.k] = ref.value if (rawRef.k) refs[rawRef.k] = ref.value