diff --git a/.flowconfig b/.flowconfig index 4bef7624..b070e08f 100644 --- a/.flowconfig +++ b/.flowconfig @@ -20,3 +20,4 @@ module.name_mapper='^weex/\(.*\)$' -> '/src/platforms/weex/\1' module.name_mapper='^server/\(.*\)$' -> '/src/server/\1' module.name_mapper='^entries/\(.*\)$' -> '/src/entries/\1' module.name_mapper='^sfc/\(.*\)$' -> '/src/sfc/\1' +suppress_comment= \\(.\\|\n\\)*\\$flow-disable-line diff --git a/src/core/vdom/modules/ref.js b/src/core/vdom/modules/ref.js index c69547ce..00bb5f52 100644 --- a/src/core/vdom/modules/ref.js +++ b/src/core/vdom/modules/ref.js @@ -32,10 +32,11 @@ export function registerRef (vnode: VNodeWithData, isRemoval: ?boolean) { } } else { if (vnode.data.refInFor) { - if (Array.isArray(refs[key]) && refs[key].indexOf(ref) < 0) { - refs[key].push(ref) - } else { + if (!Array.isArray(refs[key])) { refs[key] = [ref] + } else if (refs[key].indexOf(ref) < 0) { + // $flow-disable-line + refs[key].push(ref) } } else { refs[key] = ref diff --git a/test/unit/features/ref.spec.js b/test/unit/features/ref.spec.js index da637b7b..f82efe45 100644 --- a/test/unit/features/ref.spec.js +++ b/test/unit/features/ref.spec.js @@ -146,6 +146,56 @@ describe('ref', () => { } }) + it('should work with v-for on dynamic component', done => { + components.test3 = { + id: 'test3', + template: `
test3
`, + data () { + return { normal: false } + }, + components: { test1: components.test } + } + // a flag that representing whether to test component content or not + let testContent = false + + const vm = new Vue({ + template: ` +
+ + +
+ `, + data: { + items: ['test2', 'test3'] + }, + components + }).$mount() + assertRefs() + expect(vm.$refs.children[0].$el.textContent).toBe('test2') + expect(vm.$refs.children[1].$el.textContent).toBe('test') + // updating + vm.$refs.children[1].normal = true + testContent = true + waitForUpdate(assertRefs) + .then(() => { vm.items.push('test') }) + .then(assertRefs) + .then(done) + + function assertRefs () { + expect(Array.isArray(vm.$refs.children)).toBe(true) + expect(vm.$refs.children.length).toBe(vm.items.length) + if (testContent) { + expect( + vm.$refs.children.every((comp, i) => comp.$el.textContent === vm.items[i]) + ).toBe(true) + } + } + }) + it('should register on component with empty roots', () => { const vm = new Vue({ template: '',