mirror of
https://gitee.com/vuejs/vue.git
synced 2024-12-02 03:57:36 +08:00
fix: should consider presence of normal slots when caching normalized scoped slots
fix #9644
This commit is contained in:
parent
da77d6a98b
commit
9313cf9174
@ -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 = {}
|
||||
@ -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
|
||||
@ -48,6 +50,7 @@ export function normalizeScopedSlots (
|
||||
}
|
||||
def(res, '$stable', isStable)
|
||||
def(res, '$key', key)
|
||||
def(res, '$hasNormal', hasNormalSlots)
|
||||
return res
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
})
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user