Skip to content

Commit

Permalink
fix(keep-alive): fix activated hook invocation on nested components (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangzhonghe authored Aug 6, 2020
1 parent 00683fc commit 233d191
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
30 changes: 30 additions & 0 deletions packages/runtime-core/__tests__/components/KeepAlive.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,36 @@ describe('KeepAlive', () => {
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 () => {
const toggle2 = ref(true)
one.render = () => h(KeepAlive, () => (toggle2.value ? h(two) : null))
Expand Down
5 changes: 4 additions & 1 deletion packages/runtime-core/src/renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1265,7 +1265,7 @@ function baseCreateRenderer(
if (!instance.isMounted) {
let vnodeHook: VNodeHook | null | undefined
const { el, props } = initialVNode
const { bm, m, a, parent } = instance
const { bm, m, parent } = instance
if (__DEV__) {
startMeasure(instance, `render`)
}
Expand Down Expand Up @@ -1324,6 +1324,9 @@ function baseCreateRenderer(
}, parentSuspense)
}
// 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 (
a &&
initialVNode.shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE
Expand Down

0 comments on commit 233d191

Please sign in to comment.