@@ -31,6 +31,21 @@ function findAllVueComponentsFromVnode (
31
31
return components
32
32
}
33
33
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
+
34
49
export function vmCtorMatchesName ( vm : Component , name : string ) : boolean {
35
50
return ( vm . $vnode && vm . $vnode . componentOptions &&
36
51
vm . $vnode . componentOptions . Ctor . options . name === name ) ||
@@ -44,11 +59,22 @@ export function vmCtorMatchesSelector (component: Component, Ctor: Object) {
44
59
return Ctors . some ( c => Ctor [ c ] === component . __proto__ . constructor )
45
60
}
46
61
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
+
47
67
export default function findVueComponents (
48
68
root : Component ,
49
69
selectorType : ?string ,
50
70
selector : Object
51
71
) : 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
+ }
52
78
const components = root . _isVue
53
79
? findAllVueComponentsFromVm ( root )
54
80
: findAllVueComponentsFromVnode ( root )
0 commit comments