From b1a434c3d660ececf11addd191d894b9fbf1b385 Mon Sep 17 00:00:00 2001 From: Markus Oberlehner Date: Mon, 25 Feb 2019 16:19:03 +0100 Subject: [PATCH 1/3] fix: rendering async comp after context destroyed fix vuejs#9571 --- .../vdom/helpers/resolve-async-component.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/core/vdom/helpers/resolve-async-component.js b/src/core/vdom/helpers/resolve-async-component.js index 5714b4ead00..81cb8c5a570 100644 --- a/src/core/vdom/helpers/resolve-async-component.js +++ b/src/core/vdom/helpers/resolve-async-component.js @@ -51,18 +51,27 @@ export function resolveAsyncComponent ( return factory.resolved } + const owner = currentRenderingInstance + if (isDef(factory.owners) && factory.owners.indexOf(owner) === -1) { + // already pending + factory.owners.push(owner) + } + if (isTrue(factory.loading) && isDef(factory.loadingComp)) { return factory.loadingComp } - const owner = currentRenderingInstance - if (isDef(factory.owners)) { - // already pending - factory.owners.push(owner) - } else { + if (!isDef(factory.owners)) { const owners = factory.owners = [owner] let sync = true + const removeOwner = (destroyedOwner) => { + const index = owners.indexOf(destroyedOwner) + if (index > -1) owners.splice(index, 1) + } + + if (owner) owner.$on('hook:destroyed', () => removeOwner(owner)) + const forceRender = (renderCompleted: boolean) => { for (let i = 0, l = owners.length; i < l; i++) { (owners[i]: any).$forceUpdate() From dc04a12ec0860b97dcd6fe6e4ea230d8d1389d4a Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 28 Feb 2019 17:30:03 -0500 Subject: [PATCH 2/3] use remove util --- src/core/vdom/helpers/resolve-async-component.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/core/vdom/helpers/resolve-async-component.js b/src/core/vdom/helpers/resolve-async-component.js index 81cb8c5a570..d4957f0301e 100644 --- a/src/core/vdom/helpers/resolve-async-component.js +++ b/src/core/vdom/helpers/resolve-async-component.js @@ -8,7 +8,8 @@ import { isTrue, isObject, hasSymbol, - isPromise + isPromise, + remove } from 'core/util/index' import { createEmptyVNode } from 'core/vdom/vnode' @@ -64,13 +65,8 @@ export function resolveAsyncComponent ( if (!isDef(factory.owners)) { const owners = factory.owners = [owner] let sync = true - - const removeOwner = (destroyedOwner) => { - const index = owners.indexOf(destroyedOwner) - if (index > -1) owners.splice(index, 1) - } - - if (owner) owner.$on('hook:destroyed', () => removeOwner(owner)) + + ;(owner: any).$on('hook:destroyed', () => remove(owners, owner)) const forceRender = (renderCompleted: boolean) => { for (let i = 0, l = owners.length; i < l; i++) { From 9605f54dbc989dcac05e32f2c1f283067490c2eb Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 28 Feb 2019 17:36:55 -0500 Subject: [PATCH 3/3] Update resolve-async-component.js --- src/core/vdom/helpers/resolve-async-component.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/vdom/helpers/resolve-async-component.js b/src/core/vdom/helpers/resolve-async-component.js index d4957f0301e..43279b708ce 100644 --- a/src/core/vdom/helpers/resolve-async-component.js +++ b/src/core/vdom/helpers/resolve-async-component.js @@ -66,7 +66,7 @@ export function resolveAsyncComponent ( const owners = factory.owners = [owner] let sync = true - ;(owner: any).$on('hook:destroyed', () => remove(owners, owner)) + if (owner) owner.$on('hook:destroyed', () => remove(owners, owner)) const forceRender = (renderCompleted: boolean) => { for (let i = 0, l = owners.length; i < l; i++) {