@@ -20,13 +20,16 @@ export function pluckModuleFunction<F: Function> (
20
20
: [ ]
21
21
}
22
22
23
- export function addProp ( el : ASTElement , name : string , value : string , range ? : Range ) {
24
- ( el . props || ( el . props = [ ] ) ) . push ( rangeSetItem ( { name, value } , range ) )
23
+ export function addProp ( el : ASTElement , name : string , value : string , range ? : Range , dynamic ? : boolean ) {
24
+ ( el . props || ( el . props = [ ] ) ) . push ( rangeSetItem ( { name, value, dynamic } , range ) )
25
25
el . plain = false
26
26
}
27
27
28
- export function addAttr ( el : ASTElement , name : string , value : any , range ?: Range ) {
29
- ( el . attrs || ( el . attrs = [ ] ) ) . push ( rangeSetItem ( { name, value } , range ) )
28
+ export function addAttr ( el : ASTElement , name : string , value : any , range ?: Range , dynamic ?: boolean ) {
29
+ const attrs = dynamic
30
+ ? ( el . dynamicAttrs || ( el . dynamicAttrs = [ ] ) )
31
+ : ( el . attrs || ( el . attrs = [ ] ) )
32
+ attrs . push ( rangeSetItem ( { name, value, dynamic } , range ) )
30
33
el . plain = false
31
34
}
32
35
@@ -42,21 +45,36 @@ export function addDirective (
42
45
rawName : string ,
43
46
value : string ,
44
47
arg : ?string ,
48
+ isDynamicArg : boolean ,
45
49
modifiers : ?ASTModifiers ,
46
50
range ?: Range
47
51
) {
48
- ( el . directives || ( el . directives = [ ] ) ) . push ( rangeSetItem ( { name, rawName, value, arg, modifiers } , range ) )
52
+ ( el . directives || ( el . directives = [ ] ) ) . push ( rangeSetItem ( {
53
+ name,
54
+ rawName,
55
+ value,
56
+ arg,
57
+ isDynamicArg,
58
+ modifiers
59
+ } , range ) )
49
60
el . plain = false
50
61
}
51
62
63
+ function prependModifierMarker ( symbol : string , name : string , dynamic ?: boolean ) : string {
64
+ return dynamic
65
+ ? `_p(${ name } ,"${ symbol } ")`
66
+ : symbol + name // mark the event as captured
67
+ }
68
+
52
69
export function addHandler (
53
70
el : ASTElement ,
54
71
name : string ,
55
72
value : string ,
56
73
modifiers : ?ASTModifiers ,
57
74
important ?: boolean ,
58
75
warn ?: ?Function ,
59
- range ?: Range
76
+ range ?: Range ,
77
+ dynamic ?: boolean
60
78
) {
61
79
modifiers = modifiers || emptyObject
62
80
// warn prevent and passive modifier
@@ -75,28 +93,34 @@ export function addHandler (
75
93
// normalize click.right and click.middle since they don't actually fire
76
94
// this is technically browser-specific, but at least for now browsers are
77
95
// the only target envs that have right/middle clicks.
78
- if ( name === 'click' ) {
79
- if ( modifiers . right ) {
96
+ if ( modifiers . right ) {
97
+ if ( dynamic ) {
98
+ name = `( $ { name} ) === 'click' ?'contextmenu' :( $ { name} ) `
99
+ } else if (name === 'click') {
80
100
name = 'contextmenu'
81
101
delete modifiers.right
82
- } else if ( modifiers . middle ) {
102
+ }
103
+ } else if (modifiers.middle) {
104
+ if (dynamic) {
105
+ name = ` ( $ { name} ) === 'click' ?'mouseup' :( $ { name} ) `
106
+ } else if ( name === 'click' ) {
83
107
name = 'mouseup '
84
108
}
85
109
}
86
110
87
111
// check capture modifier
88
112
if ( modifiers . capture ) {
89
113
delete modifiers . capture
90
- name = '!' + name // mark the event as captured
114
+ name = prependModifierMarker ( '!' , name , dynamic )
91
115
}
92
116
if ( modifiers . once ) {
93
117
delete modifiers . once
94
- name = '~' + name // mark the event as once
118
+ name = prependModifierMarker ( '~' , name , dynamic )
95
119
}
96
120
/* istanbul ignore if */
97
121
if ( modifiers . passive ) {
98
122
delete modifiers . passive
99
- name = '&' + name // mark the event as passive
123
+ name = prependModifierMarker ( '&' , name , dynamic )
100
124
}
101
125
102
126
let events
@@ -107,7 +131,7 @@ export function addHandler (
107
131
events = el . events || ( el . events = { } )
108
132
}
109
133
110
- const newHandler : any = rangeSetItem ( { value : value . trim ( ) } , range )
134
+ const newHandler : any = rangeSetItem ( { value : value . trim ( ) , dynamic } , range )
111
135
if ( modifiers !== emptyObject ) {
112
136
newHandler . modifiers = modifiers
113
137
}
0 commit comments