Skip to content

Commit ce798c6

Browse files
committed
fix ref on empty component root (fix #3455)
1 parent e422a98 commit ce798c6

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

Diff for: src/core/vdom/modules/ref.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export default {
1717
}
1818
}
1919

20-
function registerRef (vnode: VNodeWithData, isRemoval: ?boolean) {
20+
export function registerRef (vnode: VNodeWithData, isRemoval: ?boolean) {
2121
const key = vnode.data.ref
2222
if (!key) return
2323

Diff for: src/core/vdom/patch.js

+5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import config from '../config'
1111
import VNode from './vnode'
1212
import { isPrimitive, _toString, warn } from '../util/index'
1313
import { activeInstance } from '../instance/lifecycle'
14+
import { registerRef } from './modules/ref'
1415

1516
const emptyData = {}
1617
const emptyNode = new VNode('', emptyData, [])
@@ -156,6 +157,10 @@ export function createPatchFunction (backend) {
156157
invokeCreateHooks(vnode, insertedVnodeQueue)
157158
setScope(vnode)
158159
} else {
160+
// empty component root.
161+
// skip all element-related modules except for ref (#3455)
162+
registerRef(vnode)
163+
// make sure to invoke the insert hook
159164
insertedVnodeQueue.push(vnode)
160165
}
161166
}

Diff for: test/unit/features/ref.spec.js

+12
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,16 @@ describe('ref', () => {
145145
expect(vm.$refs.list.every((comp, i) => comp.$el.textContent === String(i + 1))).toBe(true)
146146
}
147147
})
148+
149+
it('should register on component with empty roots', () => {
150+
const vm = new Vue({
151+
template: '<child ref="test"></child>',
152+
components: {
153+
child: {
154+
template: '<div v-if="false"></div>'
155+
}
156+
}
157+
}).$mount()
158+
expect(vm.$refs.test).toBe(vm.$children[0])
159+
})
148160
})

0 commit comments

Comments
 (0)