fix(keep-alive): fix activated hook invocation on nested components (#1743)
fix #1742
This commit is contained in:
parent
00683fce9a
commit
233d191d0d
@ -165,6 +165,36 @@ describe('KeepAlive', () => {
|
|||||||
assertHookCalls(two, [1, 1, 2, 2, 0])
|
assertHookCalls(two, [1, 1, 2, 2, 0])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #1742
|
||||||
|
test('should call lifecycle hooks on nested components when root component no hooks', async () => {
|
||||||
|
const two = {
|
||||||
|
name: 'two',
|
||||||
|
data: () => ({ msg: 'two' }),
|
||||||
|
render(this: any) {
|
||||||
|
return h('div', this.msg)
|
||||||
|
},
|
||||||
|
activated: jest.fn()
|
||||||
|
}
|
||||||
|
const one = {
|
||||||
|
name: 'one',
|
||||||
|
data: () => ({ msg: 'one' }),
|
||||||
|
render(this: any) {
|
||||||
|
return h(two)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const toggle = ref(true)
|
||||||
|
const App = {
|
||||||
|
render() {
|
||||||
|
return h(KeepAlive, () => (toggle.value ? h(one) : null))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
render(h(App), root)
|
||||||
|
|
||||||
|
expect(serializeInner(root)).toBe(`<div>two</div>`)
|
||||||
|
expect(two.activated).toHaveBeenCalledTimes(1)
|
||||||
|
})
|
||||||
|
|
||||||
test('should call correct hooks for nested keep-alive', async () => {
|
test('should call correct hooks for nested keep-alive', async () => {
|
||||||
const toggle2 = ref(true)
|
const toggle2 = ref(true)
|
||||||
one.render = () => h(KeepAlive, () => (toggle2.value ? h(two) : null))
|
one.render = () => h(KeepAlive, () => (toggle2.value ? h(two) : null))
|
||||||
|
@ -1265,7 +1265,7 @@ function baseCreateRenderer(
|
|||||||
if (!instance.isMounted) {
|
if (!instance.isMounted) {
|
||||||
let vnodeHook: VNodeHook | null | undefined
|
let vnodeHook: VNodeHook | null | undefined
|
||||||
const { el, props } = initialVNode
|
const { el, props } = initialVNode
|
||||||
const { bm, m, a, parent } = instance
|
const { bm, m, parent } = instance
|
||||||
if (__DEV__) {
|
if (__DEV__) {
|
||||||
startMeasure(instance, `render`)
|
startMeasure(instance, `render`)
|
||||||
}
|
}
|
||||||
@ -1324,6 +1324,9 @@ function baseCreateRenderer(
|
|||||||
}, parentSuspense)
|
}, parentSuspense)
|
||||||
}
|
}
|
||||||
// activated hook for keep-alive roots.
|
// activated hook for keep-alive roots.
|
||||||
|
// #1742 activated hook must be accessed after first render
|
||||||
|
// since the hook may be injected by a child keep-alive
|
||||||
|
const { a } = instance
|
||||||
if (
|
if (
|
||||||
a &&
|
a &&
|
||||||
initialVNode.shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE
|
initialVNode.shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE
|
||||||
|
Loading…
Reference in New Issue
Block a user