From 13196b25b8a0a84b3936982177195d2e04f13f79 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 13 Nov 2017 21:43:20 -0500 Subject: [PATCH] fix: clone slot nodes for render fn usage as well fix #7041 --- .../instance/render-helpers/resolve-slots.js | 2 +- src/core/instance/render.js | 4 +++- .../web/runtime/components/transition.js | 2 +- .../modules/vdom/patch/edge-cases.spec.js | 21 +++++++++++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/core/instance/render-helpers/resolve-slots.js b/src/core/instance/render-helpers/resolve-slots.js index 629177e4771..024fbbff7a3 100644 --- a/src/core/instance/render-helpers/resolve-slots.js +++ b/src/core/instance/render-helpers/resolve-slots.js @@ -44,7 +44,7 @@ export function resolveSlots ( } function isWhitespace (node: VNode): boolean { - return node.isComment || node.text === ' ' + return (node.isComment && !node.asyncFactory) || node.text === ' ' } export function resolveScopedSlots ( diff --git a/src/core/instance/render.js b/src/core/instance/render.js index 5b7df25c8dd..f83dc94fff7 100644 --- a/src/core/instance/render.js +++ b/src/core/instance/render.js @@ -66,7 +66,9 @@ export function renderMixin (Vue: Class) { // last render. They need to be cloned to ensure "freshness" for this render. for (const key in vm.$slots) { const slot = vm.$slots[key] - if (slot._rendered) { + // _rendered is a flag added by renderSlot, but may not be present + // if the slot is passed from manually written render functions + if (slot._rendered || (slot[0] && slot[0].elm)) { vm.$slots[key] = cloneVNodes(slot, true /* deep */) } } diff --git a/src/platforms/web/runtime/components/transition.js b/src/platforms/web/runtime/components/transition.js index 857c88f35e5..cb998aea470 100644 --- a/src/platforms/web/runtime/components/transition.js +++ b/src/platforms/web/runtime/components/transition.js @@ -82,7 +82,7 @@ export default { abstract: true, render (h: Function) { - let children: ?Array = this.$options._renderChildren + let children: any = this.$slots.default if (!children) { return } diff --git a/test/unit/modules/vdom/patch/edge-cases.spec.js b/test/unit/modules/vdom/patch/edge-cases.spec.js index 7e140534173..8793da2156d 100644 --- a/test/unit/modules/vdom/patch/edge-cases.spec.js +++ b/test/unit/modules/vdom/patch/edge-cases.spec.js @@ -246,4 +246,25 @@ describe('vdom patch: edge cases', () => { vm.$el.children[0].click() expect(spy).toHaveBeenCalled() }) + + // #7041 + it('transition children with only deep bindings should be patched on update', done => { + const vm = new Vue({ + template: ` +
+ +
+
+
+ `, + data: () => ({ + style: { color: 'red' } + }) + }).$mount() + expect(vm.$el.children[0].style.color).toBe('red') + vm.style.color = 'green' + waitForUpdate(() => { + expect(vm.$el.children[0].style.color).toBe('green') + }).then(done) + }) })