@@ -29,57 +29,70 @@ type Lifecycle =
29
29
| 'RenderTriggered'
30
30
| 'ServerPrefetch'
31
31
32
- export const Hook : HookDecorator = createDecorator ( 'Hook' )
32
+ export const Hook : HookDecorator = createDecorator ( 'Hook' , true )
33
33
34
34
export interface HookDecorator {
35
- ( lifecycle : Lifecycle ) : MethodDecorator
35
+ ( lifecycle : Lifecycle | Lifecycle [ ] ) : MethodDecorator
36
36
MetadataKey : string | symbol
37
37
}
38
38
39
39
function handler ( targetThis : any ) {
40
- const list = getProtoMetadata < Lifecycle > ( targetThis , Hook . MetadataKey )
41
- if ( ! list || ! list . length ) return
40
+ const list = getProtoMetadata < ( Lifecycle | Lifecycle [ ] ) [ ] > (
41
+ targetThis ,
42
+ Hook . MetadataKey
43
+ )
44
+ if ( ! list ?. length ) return
42
45
for ( const item of list ) {
43
46
let vueFn : any
44
- switch ( item . options ) {
45
- case 'BeforeMount' :
46
- vueFn = onBeforeMount
47
- break
48
- case 'Mounted' :
49
- vueFn = onMounted
50
- break
51
- case 'BeforeUpdate' :
52
- vueFn = onBeforeUpdate
53
- break
54
- case 'Updated' :
55
- vueFn = onUpdated
56
- break
57
- case 'BeforeUnmount' :
58
- vueFn = onBeforeUnmount
59
- break
60
- case 'Unmounted' :
61
- vueFn = onUnmounted
62
- break
63
- case 'Activated' :
64
- vueFn = onActivated
65
- break
66
- case 'Deactivated' :
67
- vueFn = onDeactivated
68
- break
69
- case 'ErrorCaptured' :
70
- vueFn = onErrorCaptured
71
- break
72
- case 'RenderTracked' :
73
- vueFn = onRenderTracked
74
- break
75
- case 'RenderTriggered' :
76
- vueFn = onRenderTriggered
77
- break
78
- case 'ServerPrefetch' :
79
- vueFn = onServerPrefetch
80
- break
47
+ const doneLife : Record < string , true > = { }
48
+ const options = item . options . slice ( )
49
+ for ( const option of options ) {
50
+ if ( Array . isArray ( option ) ) {
51
+ options . push ( ...option )
52
+ continue
53
+ }
54
+ if ( doneLife [ option ] ) continue
55
+ switch ( option ) {
56
+ case 'BeforeMount' :
57
+ vueFn = onBeforeMount
58
+ break
59
+ case 'Mounted' :
60
+ vueFn = onMounted
61
+ break
62
+ case 'BeforeUpdate' :
63
+ vueFn = onBeforeUpdate
64
+ break
65
+ case 'Updated' :
66
+ vueFn = onUpdated
67
+ break
68
+ case 'BeforeUnmount' :
69
+ vueFn = onBeforeUnmount
70
+ break
71
+ case 'Unmounted' :
72
+ vueFn = onUnmounted
73
+ break
74
+ case 'Activated' :
75
+ vueFn = onActivated
76
+ break
77
+ case 'Deactivated' :
78
+ vueFn = onDeactivated
79
+ break
80
+ case 'ErrorCaptured' :
81
+ vueFn = onErrorCaptured
82
+ break
83
+ case 'RenderTracked' :
84
+ vueFn = onRenderTracked
85
+ break
86
+ case 'RenderTriggered' :
87
+ vueFn = onRenderTriggered
88
+ break
89
+ case 'ServerPrefetch' :
90
+ vueFn = onServerPrefetch
91
+ break
92
+ }
93
+ doneLife [ option ] = true
94
+ vueFn ( ( ) => targetThis [ item . key ] ( ) )
81
95
}
82
- vueFn ( ( ) => targetThis [ item . key ] ( ) )
83
96
}
84
97
}
85
98
0 commit comments