await nextTick()
expect(mapRefs()).toMatchObject(['2', '3', '4'])
})
+
+ // #6697 v-for ref behaves differently under production and development
+ test('named ref in v-for , should be responsive when rendering', async () => {
+ const list = ref([1, 2, 3])
+ const listRefs = ref([])
+ const App = {
+ setup() {
+ return { listRefs }
+ },
+ render() {
+ return h('div', null, [
+ h('div', null, String(listRefs.value)),
+ h(
+ 'ul',
+ list.value.map(i =>
+ h(
+ 'li',
+ {
+ ref: 'listRefs',
+ ref_for: true
+ },
+ i
+ )
+ )
+ )
+ ])
+ }
+ }
+ const root = nodeOps.createElement('div')
+ render(h(App), root)
+
+ await nextTick()
+ expect(String(listRefs.value)).toBe(
+ '[object Object],[object Object],[object Object]'
+ )
+ expect(serializeInner(root)).toBe(
+ '<div><div>[object Object],[object Object],[object Object]</div><ul><li>1</li><li>2</li><li>3</li></ul></div>'
+ )
+
+ list.value.splice(0, 1)
+ await nextTick()
+ expect(String(listRefs.value)).toBe('[object Object],[object Object]')
+ expect(serializeInner(root)).toBe(
+ '<div><div>[object Object],[object Object]</div><ul><li>2</li><li>3</li></ul></div>'
+ )
+ })
})
if (_isString || _isRef) {
const doSet = () => {
if (rawRef.f) {
- const existing = _isString ? refs[ref] : ref.value
+ const existing = _isString
+ ? hasOwn(setupState, ref)
+ ? setupState[ref]
+ : refs[ref]
+ : ref.value
if (isUnmount) {
isArray(existing) && remove(existing, refValue)
} else {