Skip to content

Commit

Permalink
fix(ref): refactor function registerRef (#6039)
Browse files Browse the repository at this point in the history
fix #5997
  • Loading branch information
javoski authored and yyx990803 committed Jul 7, 2017
1 parent d8d4ca6 commit 254d85c
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 3 deletions.
1 change: 1 addition & 0 deletions .flowconfig
Expand Up @@ -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
7 changes: 4 additions & 3 deletions src/core/vdom/modules/ref.js
Expand Up @@ -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
Expand Down
50 changes: 50 additions & 0 deletions test/unit/features/ref.spec.js
Expand Up @@ -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>',
Expand Down

0 comments on commit 254d85c

Please sign in to comment.