@@ -36,15 +36,17 @@ function onCompositionEnd(e: Event) {
36
36
}
37
37
}
38
38
39
- type ModelDirective < T > = ObjectDirective < T & { _assign : AssignerFn } >
39
+ const assignKey = Symbol ( '_assign' )
40
+
41
+ type ModelDirective < T > = ObjectDirective < T & { [ assignKey ] : AssignerFn } >
40
42
41
43
// We are exporting the v-model runtime directly as vnode hooks so that it can
42
44
// be tree-shaken in case v-model is never used.
43
45
export const vModelText : ModelDirective <
44
46
HTMLInputElement | HTMLTextAreaElement
45
47
> = {
46
48
created ( el , { modifiers : { lazy, trim, number } } , vnode ) {
47
- el . _assign = getModelAssigner ( vnode )
49
+ el [ assignKey ] = getModelAssigner ( vnode )
48
50
const castToNumber =
49
51
number || ( vnode . props && vnode . props . type === 'number' )
50
52
addEventListener ( el , lazy ? 'change' : 'input' , e => {
@@ -56,7 +58,7 @@ export const vModelText: ModelDirective<
56
58
if ( castToNumber ) {
57
59
domValue = looseToNumber ( domValue )
58
60
}
59
- el . _assign ( domValue )
61
+ el [ assignKey ] ( domValue )
60
62
} )
61
63
if ( trim ) {
62
64
addEventListener ( el , 'change' , ( ) => {
@@ -78,7 +80,7 @@ export const vModelText: ModelDirective<
78
80
el . value = value == null ? '' : value
79
81
} ,
80
82
beforeUpdate ( el , { value, modifiers : { lazy, trim, number } } , vnode ) {
81
- el . _assign = getModelAssigner ( vnode )
83
+ el [ assignKey ] = getModelAssigner ( vnode )
82
84
// avoid clearing unresolved text. #2302
83
85
if ( ( el as any ) . composing ) return
84
86
if ( document . activeElement === el && el . type !== 'range' ) {
@@ -106,12 +108,12 @@ export const vModelCheckbox: ModelDirective<HTMLInputElement> = {
106
108
// #4096 array checkboxes need to be deep traversed
107
109
deep : true ,
108
110
created ( el , _ , vnode ) {
109
- el . _assign = getModelAssigner ( vnode )
111
+ el [ assignKey ] = getModelAssigner ( vnode )
110
112
addEventListener ( el , 'change' , ( ) => {
111
113
const modelValue = ( el as any ) . _modelValue
112
114
const elementValue = getValue ( el )
113
115
const checked = el . checked
114
- const assign = el . _assign
116
+ const assign = el [ assignKey ]
115
117
if ( isArray ( modelValue ) ) {
116
118
const index = looseIndexOf ( modelValue , elementValue )
117
119
const found = index !== - 1
@@ -138,7 +140,7 @@ export const vModelCheckbox: ModelDirective<HTMLInputElement> = {
138
140
// set initial checked on mount to wait for true-value/false-value
139
141
mounted : setChecked ,
140
142
beforeUpdate ( el , binding , vnode ) {
141
- el . _assign = getModelAssigner ( vnode )
143
+ el [ assignKey ] = getModelAssigner ( vnode )
142
144
setChecked ( el , binding , vnode )
143
145
}
144
146
}
@@ -163,13 +165,13 @@ function setChecked(
163
165
export const vModelRadio : ModelDirective < HTMLInputElement > = {
164
166
created ( el , { value } , vnode ) {
165
167
el . checked = looseEqual ( value , vnode . props ! . value )
166
- el . _assign = getModelAssigner ( vnode )
168
+ el [ assignKey ] = getModelAssigner ( vnode )
167
169
addEventListener ( el , 'change' , ( ) => {
168
- el . _assign ( getValue ( el ) )
170
+ el [ assignKey ] ( getValue ( el ) )
169
171
} )
170
172
} ,
171
173
beforeUpdate ( el , { value, oldValue } , vnode ) {
172
- el . _assign = getModelAssigner ( vnode )
174
+ el [ assignKey ] = getModelAssigner ( vnode )
173
175
if ( value !== oldValue ) {
174
176
el . checked = looseEqual ( value , vnode . props ! . value )
175
177
}
@@ -187,23 +189,23 @@ export const vModelSelect: ModelDirective<HTMLSelectElement> = {
187
189
. map ( ( o : HTMLOptionElement ) =>
188
190
number ? looseToNumber ( getValue ( o ) ) : getValue ( o )
189
191
)
190
- el . _assign (
192
+ el [ assignKey ] (
191
193
el . multiple
192
194
? isSetModel
193
195
? new Set ( selectedVal )
194
196
: selectedVal
195
197
: selectedVal [ 0 ]
196
198
)
197
199
} )
198
- el . _assign = getModelAssigner ( vnode )
200
+ el [ assignKey ] = getModelAssigner ( vnode )
199
201
} ,
200
202
// set value in mounted & updated because <select> relies on its children
201
203
// <option>s.
202
204
mounted ( el , { value } ) {
203
205
setSelected ( el , value )
204
206
} ,
205
207
beforeUpdate ( el , _binding , vnode ) {
206
- el . _assign = getModelAssigner ( vnode )
208
+ el [ assignKey ] = getModelAssigner ( vnode )
207
209
} ,
208
210
updated ( el , { value } ) {
209
211
setSelected ( el , value )
0 commit comments