Jelajahi Sumber

fix: force update between two components with and without slot (#11795)

ygj6 5 tahun lalu
induk
melakukan
77b5330c54

+ 2 - 1
src/core/instance/lifecycle.js

@@ -234,7 +234,8 @@ export function updateChildComponent (
   const hasDynamicScopedSlot = !!(
     (newScopedSlots && !newScopedSlots.$stable) ||
     (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||
-    (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)
+    (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key) ||
+    (!newScopedSlots && vm.$scopedSlots.$key)
   )
 
   // Any static slot children from the parent may have changed during parent's

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

@@ -1325,4 +1325,28 @@ describe('Component scoped slot', () => {
       expect(vm.$el.textContent).toMatch(`1`)
     }).then(done)
   })
+
+  // #11652
+  it('should update when swtching between two components with slot and without slot', done => {
+    const Child = {
+      template: `<div><slot/></div>`
+    }
+
+    const parent = new Vue({
+      template: `<div>
+        <child v-if="flag"><template #default>foo</template></child>
+        <child v-else></child>
+      </div>`,
+      data: {
+        flag: true
+      },
+      components: { Child }
+    }).$mount()
+
+    expect(parent.$el.textContent).toMatch(`foo`)
+    parent.flag=false
+    waitForUpdate(()=>{
+      expect(parent.$el.textContent).toMatch(``)
+    }).then(done)
+  })
 })