Skip to content

Commit

Permalink
fix: should consider presence of normal slots when caching normalized…
Browse files Browse the repository at this point in the history
… scoped slots

fix vuejs#9644
  • Loading branch information
yyx990803 authored and Lostlover committed Dec 10, 2019
1 parent e6070e7 commit f525792
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/core/vdom/helpers/normalize-scoped-slots.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export function normalizeScopedSlots (
): any {
let res
const isStable = slots ? !!slots.$stable : true
const hasNormalSlots = Object.keys(normalSlots).length > 0
const key = slots && slots.$key
if (!slots) {
res = {}
Expand All @@ -22,7 +23,8 @@ export function normalizeScopedSlots (
prevSlots &&
prevSlots !== emptyObject &&
key === prevSlots.$key &&
Object.keys(normalSlots).length === 0
!hasNormalSlots &&
!prevSlots.$hasNormal
) {
// fast path 2: stable scoped slots w/ no normal slots to proxy,
// only need to normalize once
Expand All @@ -48,6 +50,7 @@ export function normalizeScopedSlots (
}
def(res, '$stable', isStable)
def(res, '$key', key)
def(res, '$hasNormal', hasNormalSlots)
return res
}

Expand Down
37 changes: 37 additions & 0 deletions test/unit/features/component/component-scoped-slot.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1227,4 +1227,41 @@ describe('Component scoped slot', () => {
expect(vm.$el.textContent.trim()).toBe(`2`)
}).then(done)
})

// #9644
it('should factor presence of normal slots into scoped slots caching', done => {
const Wrapper = {
template: `<div>
<p>Default:<slot/></p>
<p>Content:<slot name='content'/></p>
</div>`
}

const vm = new Vue({
data: { ok: false },
components: { Wrapper },
template: `<wrapper>
<p v-if='ok'>ok</p>
<template #content>
<p v-if='ok'>ok</p>
</template>
</wrapper>`
}).$mount()

expect(vm.$el.textContent).not.toMatch(`Default:ok`)
expect(vm.$el.textContent).not.toMatch(`Content:ok`)
vm.ok = true
waitForUpdate(() => {
expect(vm.$el.textContent).toMatch(`Default:ok`)
expect(vm.$el.textContent).toMatch(`Content:ok`)
vm.ok = false
}).then(() => {
expect(vm.$el.textContent).not.toMatch(`Default:ok`)
expect(vm.$el.textContent).not.toMatch(`Content:ok`)
vm.ok = true
}).then(() => {
expect(vm.$el.textContent).toMatch(`Default:ok`)
expect(vm.$el.textContent).toMatch(`Content:ok`)
}).then(done)
})
})

0 comments on commit f525792

Please sign in to comment.