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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
21 additions and
2 deletions
-
src/core/vdom/patch.js
-
test/unit/modules/vdom/patch/edge-cases.spec.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) |
|
|
) |
|
|
) |
|
|
) |
|
|
) |
|
|
|
@ -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) |
|
|
|
|
|
}) |
|
|
}) |
|
|
}) |
|
|