@@ -31,6 +31,21 @@ function findAllVueComponentsFromVnode (
3131 return components
3232}
3333
34+ function findAllFunctionalComponentsFromVnode (
35+ vnode : Component ,
36+ components : Array < Component > = [ ]
37+ ) : Array < Component > {
38+ if ( vnode . fnOptions ) {
39+ components . push ( vnode )
40+ }
41+ if ( vnode . children ) {
42+ vnode . children . forEach ( ( child ) => {
43+ findAllFunctionalComponentsFromVnode ( child , components )
44+ } )
45+ }
46+ return components
47+ }
48+
3449export function vmCtorMatchesName ( vm : Component , name : string ) : boolean {
3550 return ( vm . $vnode && vm . $vnode . componentOptions &&
3651 vm . $vnode . componentOptions . Ctor . options . name === name ) ||
@@ -44,11 +59,22 @@ export function vmCtorMatchesSelector (component: Component, Ctor: Object) {
4459 return Ctors . some ( c => Ctor [ c ] === component . __proto__ . constructor )
4560}
4661
62+ export function vmFunctionalCtorMatchesSelector ( component : VNode , Ctor : Object ) {
63+ const Ctors = Object . keys ( component . fnOptions . _Ctor )
64+ return Ctors . some ( c => Ctor [ c ] === component . fnOptions . _Ctor [ c ] )
65+ }
66+
4767export default function findVueComponents (
4868 root : Component ,
4969 selectorType : ?string ,
5070 selector : Object
5171) : Array < Component > {
72+ if ( selector . functional ) {
73+ const components = root . _vnode
74+ ? findAllFunctionalComponentsFromVnode ( root . _vnode )
75+ : findAllFunctionalComponentsFromVnode ( root )
76+ return components . filter ( component => vmFunctionalCtorMatchesSelector ( component , selector . _Ctor ) )
77+ }
5278 const components = root . _isVue
5379 ? findAllVueComponentsFromVm ( root )
5480 : findAllVueComponentsFromVnode ( root )
0 commit comments