Skip to content

Commit 13196b2

Browse files
committed
fix: clone slot nodes for render fn usage as well
fix #7041
1 parent df82aeb commit 13196b2

File tree

4 files changed

+26
-3
lines changed

4 files changed

+26
-3
lines changed

src/core/instance/render-helpers/resolve-slots.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export function resolveSlots (
4444
}
4545

4646
function isWhitespace (node: VNode): boolean {
47-
return node.isComment || node.text === ' '
47+
return (node.isComment && !node.asyncFactory) || node.text === ' '
4848
}
4949

5050
export function resolveScopedSlots (

src/core/instance/render.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ export function renderMixin (Vue: Class<Component>) {
6666
// last render. They need to be cloned to ensure "freshness" for this render.
6767
for (const key in vm.$slots) {
6868
const slot = vm.$slots[key]
69-
if (slot._rendered) {
69+
// _rendered is a flag added by renderSlot, but may not be present
70+
// if the slot is passed from manually written render functions
71+
if (slot._rendered || (slot[0] && slot[0].elm)) {
7072
vm.$slots[key] = cloneVNodes(slot, true /* deep */)
7173
}
7274
}

src/platforms/web/runtime/components/transition.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export default {
8282
abstract: true,
8383

8484
render (h: Function) {
85-
let children: ?Array<VNode> = this.$options._renderChildren
85+
let children: any = this.$slots.default
8686
if (!children) {
8787
return
8888
}

test/unit/modules/vdom/patch/edge-cases.spec.js

+21
Original file line numberDiff line numberDiff line change
@@ -246,4 +246,25 @@ describe('vdom patch: edge cases', () => {
246246
vm.$el.children[0].click()
247247
expect(spy).toHaveBeenCalled()
248248
})
249+
250+
// #7041
251+
it('transition children with only deep bindings should be patched on update', done => {
252+
const vm = new Vue({
253+
template: `
254+
<div>
255+
<transition>
256+
<div :style="style"></div>
257+
</transition>
258+
</div>
259+
`,
260+
data: () => ({
261+
style: { color: 'red' }
262+
})
263+
}).$mount()
264+
expect(vm.$el.children[0].style.color).toBe('red')
265+
vm.style.color = 'green'
266+
waitForUpdate(() => {
267+
expect(vm.$el.children[0].style.color).toBe('green')
268+
}).then(done)
269+
})
249270
})

0 commit comments

Comments
 (0)