From b1a434c3d660ececf11addd191d894b9fbf1b385 Mon Sep 17 00:00:00 2001 From: Markus Oberlehner Date: Mon, 25 Feb 2019 16:19:03 +0100 Subject: [PATCH] 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()