|
|
@@ -1,3 +1,4 @@
|
|
|
+import Vue from 'vue'
|
|
|
import { patch } from 'web/runtime/patch'
|
|
|
import VNode from 'core/vdom/vnode'
|
|
|
|
|
|
@@ -475,6 +476,7 @@ describe('children', () => {
|
|
|
}
|
|
|
const b = makeNode('B')
|
|
|
b.isStatic = true
|
|
|
+ b.key = `__static__1`
|
|
|
const vnode1 = new VNode('div', {}, [makeNode('A'), b, makeNode('C')])
|
|
|
const vnode2 = new VNode('div', {}, [b])
|
|
|
const vnode3 = new VNode('div', {}, [makeNode('A'), b, makeNode('C')])
|
|
|
@@ -486,4 +488,49 @@ describe('children', () => {
|
|
|
elm = patch(vnode2, vnode3)
|
|
|
expect(elm.textContent).toBe('ABC')
|
|
|
})
|
|
|
+
|
|
|
+ it('should handle static vnodes inside ', function () {
|
|
|
+ function makeNode (text) {
|
|
|
+ return new VNode('div', undefined, [
|
|
|
+ new VNode(undefined, undefined, undefined, text)
|
|
|
+ ])
|
|
|
+ }
|
|
|
+ const b = makeNode('B')
|
|
|
+ b.isStatic = true
|
|
|
+ b.key = `__static__1`
|
|
|
+ const vnode1 = new VNode('div', {}, [makeNode('A'), b, makeNode('C')])
|
|
|
+ const vnode2 = new VNode('div', {}, [b])
|
|
|
+ const vnode3 = new VNode('div', {}, [makeNode('A'), b, makeNode('C')])
|
|
|
+
|
|
|
+ let elm = patch(vnode0, vnode1)
|
|
|
+ expect(elm.textContent).toBe('ABC')
|
|
|
+ elm = patch(vnode1, vnode2)
|
|
|
+ expect(elm.textContent).toBe('B')
|
|
|
+ elm = patch(vnode2, vnode3)
|
|
|
+ expect(elm.textContent).toBe('ABC')
|
|
|
+ })
|
|
|
+
|
|
|
+ // exposed by #3406
|
|
|
+ // When a static vnode is inside v-for, it's possible for the same vnode
|
|
|
+ // to be used in multiple places, and its element will be replaced. This
|
|
|
+ // causes patch errors when node ops depend on the vnode's element position.
|
|
|
+ it('should handle static vnodes by key', done => {
|
|
|
+ const vm = new Vue({
|
|
|
+ data: {
|
|
|
+ ok: true
|
|
|
+ },
|
|
|
+ template: `
|
|
|
+ <div>
|
|
|
+ <div v-for="i in 2">
|
|
|
+ <div v-if="ok">a</div><div>b</div><div v-if="!ok">c</div><div>d</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ `
|
|
|
+ }).$mount()
|
|
|
+ expect(vm.$el.textContent).toBe('abdabd')
|
|
|
+ vm.ok = false
|
|
|
+ waitForUpdate(() => {
|
|
|
+ expect(vm.$el.textContent).toBe('bcdbcd')
|
|
|
+ }).then(done)
|
|
|
+ })
|
|
|
})
|