@@ -46,7 +46,7 @@ type ModelDirective<T> = ObjectDirective<T & { _assign: AssignerFn }>
46
46
export const vModelText : ModelDirective <
47
47
HTMLInputElement | HTMLTextAreaElement
48
48
> = {
49
- beforeMount ( el , { value, modifiers : { lazy, trim, number } } , vnode ) {
49
+ created ( el , { value, modifiers : { lazy, trim, number } } , vnode ) {
50
50
el . value = value == null ? '' : value
51
51
el . _assign = getModelAssigner ( vnode )
52
52
const castToNumber = number || el . type === 'number'
@@ -90,7 +90,7 @@ export const vModelText: ModelDirective<
90
90
}
91
91
92
92
export const vModelCheckbox : ModelDirective < HTMLInputElement > = {
93
- beforeMount ( el , binding , vnode ) {
93
+ created ( el , binding , vnode ) {
94
94
setChecked ( el , binding , vnode )
95
95
el . _assign = getModelAssigner ( vnode )
96
96
addEventListener ( el , 'change' , ( ) => {
@@ -135,7 +135,7 @@ function setChecked(
135
135
}
136
136
137
137
export const vModelRadio : ModelDirective < HTMLInputElement > = {
138
- beforeMount ( el , { value } , vnode ) {
138
+ created ( el , { value } , vnode ) {
139
139
el . checked = looseEqual ( value , vnode . props ! . value )
140
140
el . _assign = getModelAssigner ( vnode )
141
141
addEventListener ( el , 'change' , ( ) => {
@@ -151,16 +151,19 @@ export const vModelRadio: ModelDirective<HTMLInputElement> = {
151
151
}
152
152
153
153
export const vModelSelect : ModelDirective < HTMLSelectElement > = {
154
- // use mounted & updated because <select> relies on its children <option>s.
155
- mounted ( el , { value } , vnode ) {
156
- setSelected ( el , value )
157
- el . _assign = getModelAssigner ( vnode )
154
+ created ( el , binding , vnode ) {
158
155
addEventListener ( el , 'change' , ( ) => {
159
156
const selectedVal = Array . prototype . filter
160
157
. call ( el . options , ( o : HTMLOptionElement ) => o . selected )
161
158
. map ( getValue )
162
159
el . _assign ( el . multiple ? selectedVal : selectedVal [ 0 ] )
163
160
} )
161
+ el . _assign = getModelAssigner ( vnode )
162
+ } ,
163
+ // set value in mounted & updated because <select> relies on its children
164
+ // <option>s.
165
+ mounted ( el , { value } ) {
166
+ setSelected ( el , value )
164
167
} ,
165
168
beforeUpdate ( el , _binding , vnode ) {
166
169
el . _assign = getModelAssigner ( vnode )
@@ -214,8 +217,8 @@ function getCheckboxValue(
214
217
export const vModelDynamic : ObjectDirective <
215
218
HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement
216
219
> = {
217
- beforeMount ( el , binding , vnode ) {
218
- callModelHook ( el , binding , vnode , null , 'beforeMount ' )
220
+ created ( el , binding , vnode ) {
221
+ callModelHook ( el , binding , vnode , null , 'created ' )
219
222
} ,
220
223
mounted ( el , binding , vnode ) {
221
224
callModelHook ( el , binding , vnode , null , 'mounted' )
@@ -233,7 +236,7 @@ function callModelHook(
233
236
binding : DirectiveBinding ,
234
237
vnode : VNode ,
235
238
prevVNode : VNode | null ,
236
- hook : 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated'
239
+ hook : keyof ObjectDirective
237
240
) {
238
241
let modelToUse : ObjectDirective
239
242
switch ( el . tagName ) {
@@ -244,7 +247,7 @@ function callModelHook(
244
247
modelToUse = vModelText
245
248
break
246
249
default :
247
- switch ( el . type ) {
250
+ switch ( vnode . props && vnode . props . type ) {
248
251
case 'checkbox' :
249
252
modelToUse = vModelCheckbox
250
253
break
0 commit comments