1
+ import Vue from 'vue'
1
2
import { patch } from 'web/runtime/patch'
2
3
import VNode from 'core/vdom/vnode'
3
4
@@ -475,6 +476,7 @@ describe('children', () => {
475
476
}
476
477
const b = makeNode ( 'B' )
477
478
b . isStatic = true
479
+ b . key = `__static__1`
478
480
const vnode1 = new VNode ( 'div' , { } , [ makeNode ( 'A' ) , b , makeNode ( 'C' ) ] )
479
481
const vnode2 = new VNode ( 'div' , { } , [ b ] )
480
482
const vnode3 = new VNode ( 'div' , { } , [ makeNode ( 'A' ) , b , makeNode ( 'C' ) ] )
@@ -486,4 +488,49 @@ describe('children', () => {
486
488
elm = patch ( vnode2 , vnode3 )
487
489
expect ( elm . textContent ) . toBe ( 'ABC' )
488
490
} )
491
+
492
+ it ( 'should handle static vnodes inside ' , function ( ) {
493
+ function makeNode ( text ) {
494
+ return new VNode ( 'div' , undefined , [
495
+ new VNode ( undefined , undefined , undefined , text )
496
+ ] )
497
+ }
498
+ const b = makeNode ( 'B' )
499
+ b . isStatic = true
500
+ b . key = `__static__1`
501
+ const vnode1 = new VNode ( 'div' , { } , [ makeNode ( 'A' ) , b , makeNode ( 'C' ) ] )
502
+ const vnode2 = new VNode ( 'div' , { } , [ b ] )
503
+ const vnode3 = new VNode ( 'div' , { } , [ makeNode ( 'A' ) , b , makeNode ( 'C' ) ] )
504
+
505
+ let elm = patch ( vnode0 , vnode1 )
506
+ expect ( elm . textContent ) . toBe ( 'ABC' )
507
+ elm = patch ( vnode1 , vnode2 )
508
+ expect ( elm . textContent ) . toBe ( 'B' )
509
+ elm = patch ( vnode2 , vnode3 )
510
+ expect ( elm . textContent ) . toBe ( 'ABC' )
511
+ } )
512
+
513
+ // exposed by #3406
514
+ // When a static vnode is inside v-for, it's possible for the same vnode
515
+ // to be used in multiple places, and its element will be replaced. This
516
+ // causes patch errors when node ops depend on the vnode's element position.
517
+ it ( 'should handle static vnodes by key' , done => {
518
+ const vm = new Vue ( {
519
+ data : {
520
+ ok : true
521
+ } ,
522
+ template : `
523
+ <div>
524
+ <div v-for="i in 2">
525
+ <div v-if="ok">a</div><div>b</div><div v-if="!ok">c</div><div>d</div>
526
+ </div>
527
+ </div>
528
+ `
529
+ } ) . $mount ( )
530
+ expect ( vm . $el . textContent ) . toBe ( 'abdabd' )
531
+ vm . ok = false
532
+ waitForUpdate ( ( ) => {
533
+ expect ( vm . $el . textContent ) . toBe ( 'bcdbcd' )
534
+ } ) . then ( done )
535
+ } )
489
536
} )
0 commit comments