Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
forked fromvuejs/vue

Commit58a39df

Browse files
gebilaoxiongyyx990803
authored andcommitted
fix(model): correctly set select v-model initial value on patch (vuejs#6910)
1 parent0c703e3 commit58a39df

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

‎src/platforms/web/runtime/directives/model.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import{isTextInputType}from'web/util/element'
77
import{looseEqual,looseIndexOf}from'shared/util'
88
import{warn,isAndroid,isIE9,isIE,isEdge}from'core/util/index'
9+
import{mergeVNodeHook}from'core/vdom/helpers/index'
10+
import{emptyNode}from'core/vdom/patch'
911

1012
/* istanbul ignore if */
1113
if(isIE9){
@@ -18,10 +20,17 @@ if (isIE9) {
1820
})
1921
}
2022

21-
exportdefault{
22-
inserted(el,binding,vnode){
23+
constdirective={
24+
inserted(el,binding,vnode,oldVnode){
2325
if(vnode.tag==='select'){
24-
setSelected(el,binding,vnode.context)
26+
// #6903
27+
if(oldVnode!==emptyNode&&!hasDirective(oldVnode,'model')){
28+
mergeVNodeHook(vnode.data.hook||(vnode.data.hook={}),'postpatch',()=>{
29+
directive.componentUpdated(el,binding,vnode)
30+
})
31+
}else{
32+
setSelected(el,binding,vnode.context)
33+
}
2534
el._vOptions=[].map.call(el.options,getValue)
2635
}elseif(vnode.tag==='textarea'||isTextInputType(el.type)){
2736
el._vModifiers=binding.modifiers
@@ -136,3 +145,11 @@ function trigger (el, type) {
136145
e.initEvent(type,true,true)
137146
el.dispatchEvent(e)
138147
}
148+
149+
functionhasDirective(vnode,dirname){
150+
returnvnode.data&&
151+
vnode.data.directives&&
152+
vnode.data.directives.some(dir=>dir.name===dirname)
153+
}
154+
155+
exportdefaultdirective

‎test/unit/features/directives/model-select.spec.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,4 +546,46 @@ describe('Directive v-model select', () => {
546546
expect(spy).not.toHaveBeenCalled()
547547
}).then(done)
548548
})
549+
550+
// #6903
551+
describe('should correctly handle v-model when the vnodes are the same',()=>{
552+
functionmakeInstance(foo){
553+
returnnewVue({
554+
data:{
555+
foo:foo,
556+
options:['b','c','d'],
557+
value:'c'
558+
},
559+
template:
560+
'<div>'+
561+
'<select v-if="foo" data-attr>'+
562+
'<option selected>a</option>'+
563+
'</select>'+
564+
'<select v-else v-model="value">'+
565+
'<option v-for="option in options" :value="option">{{ option }}</option>'+
566+
'</select>'+
567+
'</div>'
568+
}).$mount()
569+
}
570+
571+
it('register v-model',done=>{
572+
constvm=makeInstance(true)
573+
574+
expect(vm.$el.firstChild.selectedIndex).toBe(0)
575+
vm.foo=false
576+
waitForUpdate(()=>{
577+
expect(vm.$el.firstChild.selectedIndex).toBe(1)
578+
}).then(done)
579+
})
580+
581+
it('remove v-model',done=>{
582+
constvm=makeInstance(false)
583+
584+
expect(vm.$el.firstChild.selectedIndex).toBe(1)
585+
vm.foo=true
586+
waitForUpdate(()=>{
587+
expect(vm.$el.firstChild.selectedIndex).toBe(0)
588+
}).then(done)
589+
})
590+
})
549591
})

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp