@@ -5,9 +5,18 @@ import { mergeVNodeHook } from 'core/vdom/helpers'
5
5
6
6
export default {
7
7
create : function bindDirectives ( oldVnode : VNodeWithData , vnode : VNodeWithData ) {
8
- mergeVNodeHook ( vnode . data . hook || ( vnode . data . hook = { } ) , 'insert' , ( ) => {
9
- applyDirectives ( oldVnode , vnode , 'bind' )
8
+ let hasInsert = false
9
+ forEachDirective ( oldVnode , vnode , ( def , dir ) => {
10
+ callHook ( def , dir , 'bind' , vnode , oldVnode )
11
+ if ( def . inserted ) {
12
+ hasInsert = true
13
+ }
10
14
} )
15
+ if ( hasInsert ) {
16
+ mergeVNodeHook ( vnode . data . hook || ( vnode . data . hook = { } ) , 'insert' , ( ) => {
17
+ applyDirectives ( oldVnode , vnode , 'inserted' )
18
+ } )
19
+ }
11
20
} ,
12
21
update : function updateDirectives ( oldVnode : VNodeWithData , vnode : VNodeWithData ) {
13
22
applyDirectives ( oldVnode , vnode , 'update' )
@@ -27,28 +36,43 @@ export default {
27
36
28
37
const emptyModifiers = Object . create ( null )
29
38
30
- function applyDirectives (
39
+ function forEachDirective (
31
40
oldVnode : VNodeWithData ,
32
41
vnode : VNodeWithData ,
33
- hook : string
42
+ fn : Function
34
43
) {
35
44
const dirs = vnode . data . directives
36
45
if ( dirs ) {
37
- const oldDirs = oldVnode . data . directives
38
- const isUpdate = hook === 'update' || hook === 'componentUpdated'
39
46
for ( let i = 0 ; i < dirs . length ; i ++ ) {
40
47
const dir = dirs [ i ]
41
48
const def = resolveAsset ( vnode . context . $options , 'directives' , dir . name , true )
42
- const fn = def && def [ hook ]
43
- if ( fn ) {
44
- if ( isUpdate && oldDirs ) {
49
+ if ( def ) {
50
+ const oldDirs = oldVnode && oldVnode . data . directives
51
+ if ( oldDirs ) {
45
52
dir . oldValue = oldDirs [ i ] . value
46
53
}
47
54
if ( ! dir . modifiers ) {
48
55
dir . modifiers = emptyModifiers
49
56
}
50
- fn ( vnode . elm , dir , vnode , oldVnode )
57
+ fn ( def , dir )
51
58
}
52
59
}
53
60
}
54
61
}
62
+
63
+ function applyDirectives (
64
+ oldVnode : VNodeWithData ,
65
+ vnode : VNodeWithData ,
66
+ hook : string
67
+ ) {
68
+ forEachDirective ( oldVnode , vnode , ( def , dir ) => {
69
+ callHook ( def , dir , hook , vnode , oldVnode )
70
+ } )
71
+ }
72
+
73
+ function callHook ( def , dir , hook , vnode , oldVnode ) {
74
+ const fn = def && def [ hook ]
75
+ if ( fn ) {
76
+ fn ( vnode . elm , dir , vnode , oldVnode )
77
+ }
78
+ }
0 commit comments