From 55b364decc903a6c7fccd1cdcdcfc79948c848a2 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 31 Mar 2020 10:30:12 -0400 Subject: [PATCH] feat(templateRef): support template ref for all vnode types --- packages/runtime-core/src/renderer.ts | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 5952abc73..0577f8c4a 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -363,7 +363,7 @@ function baseCreateRenderer( n1 = null } - const { type, shapeFlag } = n2 + const { type, ref, shapeFlag } = n2 switch (type) { case Text: processText(n1, n2, container, anchor) @@ -439,6 +439,13 @@ function baseCreateRenderer( warn('Invalid VNode type:', type, `(${typeof type})`) } } + + // set ref + if (ref != null && parentComponent) { + const refValue = + shapeFlag & ShapeFlags.STATEFUL_COMPONENT ? n2.component!.proxy : n2.el + setRef(ref, n1 && n1.ref, parentComponent, refValue) + } } const processText: ProcessTextOrCommentFn = (n1, n2, container, anchor) => { @@ -518,9 +525,6 @@ function baseCreateRenderer( } else { patchElement(n1, n2, parentComponent, parentSuspense, isSVG, optimized) } - if (n2.ref != null && parentComponent) { - setRef(n2.ref, n1 && n1.ref, parentComponent, n2.el) - } } const mountElement = ( @@ -1005,17 +1009,6 @@ function baseCreateRenderer( n2.el = n1.el } } - if (n2.ref != null && parentComponent) { - if (__DEV__ && !(n2.shapeFlag & ShapeFlags.STATEFUL_COMPONENT)) { - pushWarningContext(n2) - warn( - `Functional components do not support "ref" because they do not ` + - `have instances.` - ) - popWarningContext() - } - setRef(n2.ref, n1 && n1.ref, parentComponent, n2.component!.proxy) - } } const mountComponent: MountComponentFn = (