fix(keep-alive): invoke initial activated hook for async components
revert #5459 fix #5095 fix #5651
This commit is contained in:
parent
9d815d28ad
commit
20ed16f68c
@ -802,7 +802,7 @@ describe('api: defineAsyncComponent', () => {
|
|||||||
expect(vnodeHooks.onVnodeUnmounted).toHaveBeenCalledTimes(1)
|
expect(vnodeHooks.onVnodeUnmounted).toHaveBeenCalledTimes(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('with keepalive', async () => {
|
test('with KeepAlive', async () => {
|
||||||
const spy = jest.fn()
|
const spy = jest.fn()
|
||||||
let resolve: (comp: Component) => void
|
let resolve: (comp: Component) => void
|
||||||
|
|
||||||
@ -813,9 +813,12 @@ describe('api: defineAsyncComponent', () => {
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const Bar = defineAsyncComponent(() => Promise.resolve(() => 'Bar'))
|
||||||
|
|
||||||
|
const toggle = ref(true)
|
||||||
const root = nodeOps.createElement('div')
|
const root = nodeOps.createElement('div')
|
||||||
const app = createApp({
|
const app = createApp({
|
||||||
render: () => h(KeepAlive, [h(Foo)])
|
render: () => h(KeepAlive, [toggle.value ? h(Foo) : h(Bar)])
|
||||||
})
|
})
|
||||||
|
|
||||||
app.mount(root)
|
app.mount(root)
|
||||||
@ -826,13 +829,16 @@ describe('api: defineAsyncComponent', () => {
|
|||||||
onActivated(() => {
|
onActivated(() => {
|
||||||
spy()
|
spy()
|
||||||
})
|
})
|
||||||
return () => 'resolved'
|
return () => 'Foo'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
await timeout()
|
await timeout()
|
||||||
expect(serializeInner(root)).toBe('resolved')
|
expect(serializeInner(root)).toBe('Foo')
|
||||||
expect(spy).toBeCalledTimes(1)
|
expect(spy).toBeCalledTimes(1)
|
||||||
})
|
|
||||||
|
|
||||||
|
toggle.value = false
|
||||||
|
await timeout()
|
||||||
|
expect(serializeInner(root)).toBe('Bar')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -6,7 +6,7 @@ import {
|
|||||||
isInSSRComponentSetup,
|
isInSSRComponentSetup,
|
||||||
ComponentOptions
|
ComponentOptions
|
||||||
} from './component'
|
} from './component'
|
||||||
import { isFunction, isObject, ShapeFlags } from '@vue/shared'
|
import { isFunction, isObject } from '@vue/shared'
|
||||||
import { ComponentPublicInstance } from './componentPublicInstance'
|
import { ComponentPublicInstance } from './componentPublicInstance'
|
||||||
import { createVNode, VNode } from './vnode'
|
import { createVNode, VNode } from './vnode'
|
||||||
import { defineComponent } from './apiDefineComponent'
|
import { defineComponent } from './apiDefineComponent'
|
||||||
@ -211,14 +211,13 @@ export function defineAsyncComponent<
|
|||||||
|
|
||||||
function createInnerComp(
|
function createInnerComp(
|
||||||
comp: ConcreteComponent,
|
comp: ConcreteComponent,
|
||||||
{ vnode: { ref, props, children }, parent }: ComponentInternalInstance
|
{
|
||||||
|
vnode: { ref, props, children, shapeFlag },
|
||||||
|
parent
|
||||||
|
}: ComponentInternalInstance
|
||||||
) {
|
) {
|
||||||
const vnode = createVNode(comp, props, children)
|
const vnode = createVNode(comp, props, children)
|
||||||
// ensure inner component inherits the async wrapper's ref owner
|
// ensure inner component inherits the async wrapper's ref owner
|
||||||
vnode.ref = ref
|
vnode.ref = ref
|
||||||
|
|
||||||
if (parent && isKeepAlive(parent.vnode)) {
|
|
||||||
vnode.shapeFlag |= ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE
|
|
||||||
}
|
|
||||||
return vnode
|
return vnode
|
||||||
}
|
}
|
||||||
|
@ -1420,7 +1420,12 @@ function baseCreateRenderer(
|
|||||||
// activated hook for keep-alive roots.
|
// activated hook for keep-alive roots.
|
||||||
// #1742 activated hook must be accessed after first render
|
// #1742 activated hook must be accessed after first render
|
||||||
// since the hook may be injected by a child keep-alive
|
// since the hook may be injected by a child keep-alive
|
||||||
if (initialVNode.shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE) {
|
if (
|
||||||
|
initialVNode.shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE ||
|
||||||
|
(parent &&
|
||||||
|
isAsyncWrapper(parent.vnode) &&
|
||||||
|
parent.vnode.shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE)
|
||||||
|
) {
|
||||||
instance.a && queuePostRenderEffect(instance.a, parentSuspense)
|
instance.a && queuePostRenderEffect(instance.a, parentSuspense)
|
||||||
if (
|
if (
|
||||||
__COMPAT__ &&
|
__COMPAT__ &&
|
||||||
|
Loading…
x
Reference in New Issue
Block a user