From 464e39b5e4808d6f3f1d0cbf8cad0cbbf453f258 Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Thu, 9 Aug 2018 19:38:58 +0100 Subject: [PATCH 1/3] test(component-slot): new child vnode gets destroyed instead of old one fix #8337 --- .../features/component/component-slot.spec.js | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/test/unit/features/component/component-slot.spec.js b/test/unit/features/component/component-slot.spec.js index e667a46ef89..ed8215fdf1b 100644 --- a/test/unit/features/component/component-slot.spec.js +++ b/test/unit/features/component/component-slot.spec.js @@ -886,4 +886,47 @@ describe('Component slot', () => { expect(vm.$el.textContent).toBe('foo') }).then(done) }) + + // #8337 + it('should not destroy the new child vm', done => { + const Parent = { + render (h) { + return h(this.API.tag, this.$slots.default) + }, + data () { + return { API: { tag: 'p' }} + }, + provide () { + return { key: this.API } + } + } + + const Child = { + template: '
', + inject: { wrapper: 'key' }, + created () { + this.wrapper.tag = 'div' + } + } + + const vm = new Vue({ + components: { + Child, + Parent + }, + template: ` + +
+ +
+
+ ` + }).$mount() + + expect(vm.$refs.child).toBeDefined() + + waitForUpdate(() => { + expect(vm.$refs.child).toBeDefined() + }).then(done) + }) }) From 14133787d42991426a05dd7479b7c8e36df1c806 Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Thu, 9 Aug 2018 19:53:25 +0100 Subject: [PATCH 2/3] fix(patch): Deep clone vnode when used in previous render fix #8337 --- src/core/vdom/patch.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/vdom/patch.js b/src/core/vdom/patch.js index fb28d8cd341..eb790d9a906 100644 --- a/src/core/vdom/patch.js +++ b/src/core/vdom/patch.js @@ -138,6 +138,9 @@ export function createPatchFunction (backend) { // reference node. Instead, we clone the node on-demand before creating // associated DOM element for it. vnode = ownerArray[index] = cloneVNode(vnode) + if (vnode.children) { + vnode.children = vnode.children.map(cloneVNode) + } } vnode.isRootInsert = !nested // for transition enter check From 9114bca874990fba73f7156a08199bca53e9c9ed Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Thu, 9 Aug 2018 20:05:21 +0100 Subject: [PATCH 3/3] retrigger test