Bläddra i källkod

fix(ref): refactor function registerRef (#6039)

fix #5997
AchillesJ 8 år sedan
förälder
incheckning
254d85cfc4
3 ändrade filer med 55 tillägg och 3 borttagningar
  1. 1 0
      .flowconfig
  2. 4 3
      src/core/vdom/modules/ref.js
  3. 50 0
      test/unit/features/ref.spec.js

+ 1 - 0
.flowconfig

@@ -20,3 +20,4 @@ module.name_mapper='^weex/\(.*\)$' -> '<PROJECT_ROOT>/src/platforms/weex/\1'
 module.name_mapper='^server/\(.*\)$' -> '<PROJECT_ROOT>/src/server/\1'
 module.name_mapper='^entries/\(.*\)$' -> '<PROJECT_ROOT>/src/entries/\1'
 module.name_mapper='^sfc/\(.*\)$' -> '<PROJECT_ROOT>/src/sfc/\1'
+suppress_comment= \\(.\\|\n\\)*\\$flow-disable-line

+ 4 - 3
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

+ 50 - 0
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: `<test1 v-if="!normal"></test1><div v-else>test3</div>`,
+      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: `
+        <div>
+          <component
+            v-for="(item, index) in items"
+            :key="index"
+            :is="item"
+            ref="children">
+          </component>
+        </div>
+      `,
+      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: '<child ref="test"></child>',