fix(slots): fix slots not updating when passing down normal slots as $scopedSlots

fix #9699
This commit is contained in:
Evan You 2019-03-18 17:42:16 +08:00
parent 3433ba5bee
commit ebc1893fac
2 changed files with 33 additions and 1 deletions

View File

@ -10,8 +10,8 @@ export function normalizeScopedSlots (
prevSlots?: { [key: string]: Function } | void
): any {
let res
const isStable = slots ? !!slots.$stable : true
const hasNormalSlots = Object.keys(normalSlots).length > 0
const isStable = slots ? !!slots.$stable : !hasNormalSlots
const key = slots && slots.$key
if (!slots) {
res = {}

View File

@ -1277,4 +1277,36 @@ describe('Component scoped slot', () => {
}).$mount()
expect(vm.$el.textContent).toMatch('fallback')
})
// #9699
// Component only has normal slots, but is passing down $scopedSlots directly
// $scopedSlots should not be marked as stable in this case
it('render function passing $scopedSlots w/ normal slots down', done => {
const one = {
template: `<div><slot name="footer"/></div>`
}
const two = {
render(h) {
return h(one, {
scopedSlots: this.$scopedSlots
})
}
}
const vm = new Vue({
data: { count: 0 },
render(h) {
return h(two, [
h('span', { slot: 'footer' }, this.count)
])
}
}).$mount()
expect(vm.$el.textContent).toMatch(`0`)
vm.count++
waitForUpdate(() => {
expect(vm.$el.textContent).toMatch(`1`)
}).then(done)
})
})