Browse Source

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

fix #5997
dev
AchillesJ 7 years ago
committed by Evan You
parent
commit
254d85cfc4
  1. 1
      .flowconfig
  2. 7
      src/core/vdom/modules/ref.js
  3. 50
      test/unit/features/ref.spec.js

1
.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

7
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
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>',

Loading…
Cancel
Save