1+ import Vue from 'vue'
12import { patch } from 'web/runtime/patch'
23import VNode from 'core/vdom/vnode'
34
@@ -475,6 +476,7 @@ describe('children', () => {
475476 }
476477 const b = makeNode ( 'B' )
477478 b . isStatic = true
479+ b . key = `__static__1`
478480 const vnode1 = new VNode ( 'div' , { } , [ makeNode ( 'A' ) , b , makeNode ( 'C' ) ] )
479481 const vnode2 = new VNode ( 'div' , { } , [ b ] )
480482 const vnode3 = new VNode ( 'div' , { } , [ makeNode ( 'A' ) , b , makeNode ( 'C' ) ] )
@@ -486,4 +488,49 @@ describe('children', () => {
486488 elm = patch ( vnode2 , vnode3 )
487489 expect ( elm . textContent ) . toBe ( 'ABC' )
488490 } )
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+ } )
489536} )
0 commit comments