Browse Source

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

Co-authored-by: mac2 <mac2@example.com>
dev
contribu 4 years ago
committed by GitHub
parent
commit
52608302e9
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      src/core/vdom/patch.js
  2. 19
      test/unit/modules/vdom/patch/edge-cases.spec.js

4
src/core/vdom/patch.js

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

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

@ -1,4 +1,5 @@
import Vue from 'vue' import Vue from 'vue'
import { SSR_ATTR } from 'shared/constants'
describe('vdom patch: edge cases', () => { describe('vdom patch: edge cases', () => {
// exposed by #3406 // exposed by #3406
@ -432,4 +433,22 @@ describe('vdom patch: edge cases', () => {
expect(vm.$el.textContent).not.toMatch('Infinity') expect(vm.$el.textContent).not.toMatch('Infinity')
}).then(done) }).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)
})
}) })

Loading…
Cancel
Save