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

fix(core): fix sameVnode for async component (#11107)

Co-authored-by: mac2 <mac2@example.com>
contribu 5 лет назад
Родитель
Сommit
52608302e9
2 измененных файлов с 21 добавлено и 2 удалено
  1. 2 2
      src/core/vdom/patch.js
  2. 19 0
      test/unit/modules/vdom/patch/edge-cases.spec.js

+ 2 - 2
src/core/vdom/patch.js

@@ -34,7 +34,8 @@ const hooks = ['create', 'activate', 'update', 'remove', 'destroy']
 
 function sameVnode (a, b) {
   return (
-    a.key === b.key && (
+    a.key === b.key &&
+    a.asyncFactory === b.asyncFactory && (
       (
         a.tag === b.tag &&
         a.isComment === b.isComment &&
@@ -42,7 +43,6 @@ function sameVnode (a, b) {
         sameInputType(a, b)
       ) || (
         isTrue(a.isAsyncPlaceholder) &&
-        a.asyncFactory === b.asyncFactory &&
         isUndef(b.asyncFactory.error)
       )
     )

+ 19 - 0
test/unit/modules/vdom/patch/edge-cases.spec.js

@@ -1,4 +1,5 @@
 import Vue from 'vue'
+import { SSR_ATTR } from 'shared/constants'
 
 describe('vdom patch: edge cases', () => {
   // exposed by #3406
@@ -432,4 +433,22 @@ describe('vdom patch: edge cases', () => {
       expect(vm.$el.textContent).not.toMatch('Infinity')
     }).then(done)
   })
+
+  it('should not throw when hydrated pending async component is patched by v-if="false"', done => {
+    const PendingAsyncComponent = () => new Promise(() => {})
+    const ssrAsyncComponent = document.createElement('div')
+    ssrAsyncComponent.setAttribute(SSR_ATTR, 'true')
+    const vm = new Vue({
+      data: {
+        visible: true
+      },
+      components: {
+        PendingAsyncComponent
+      },
+      template: '<pending-async-component v-if="visible"></pending-async-component>'
+    }).$mount(ssrAsyncComponent)
+
+    vm.visible = false
+    vm.$nextTick(done)
+  })
 })