Просмотр исходного кода

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

fix #9699
Evan You 7 лет назад
Родитель
Сommit
ebc1893fac

+ 1 - 1
src/core/vdom/helpers/normalize-scoped-slots.js

@@ -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 = {}

+ 32 - 0
test/unit/features/component/component-scoped-slot.spec.js

@@ -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)
+  })
 })