await nextTick()
expect(Foo.unmounted).not.toHaveBeenCalled()
})
+
+ test('should update re-activated component if props have changed', async () => {
+ const Foo = (props: { n: number }) => props.n
+
+ const toggle = ref(true)
+ const n = ref(0)
+
+ const App = {
+ setup() {
+ return () =>
+ h(KeepAlive, () => (toggle.value ? h(Foo, { n: n.value }) : null))
+ }
+ }
+
+ render(h(App), root)
+ expect(serializeInner(root)).toBe(`0`)
+
+ toggle.value = false
+ await nextTick()
+ expect(serializeInner(root)).toBe(`<!---->`)
+
+ n.value++
+ await nextTick()
+ toggle.value = true
+ await nextTick()
+ expect(serializeInner(root)).toBe(`1`)
+ })
})
})
activate: (
vnode: VNode,
container: RendererElement,
- anchor: RendererNode | null
+ anchor: RendererNode | null,
+ isSVG: boolean,
+ optimized: boolean
) => void
deactivate: (vnode: VNode) => void
}
const sink = instance.sink as KeepAliveSink
const {
renderer: {
+ p: patch,
m: move,
um: _unmount,
o: { createElement }
} = sink
const storageContainer = createElement('div')
- sink.activate = (vnode, container, anchor) => {
+ sink.activate = (vnode, container, anchor, isSVG, optimized) => {
+ const child = vnode.component!
move(vnode, container, anchor, MoveType.ENTER, parentSuspense)
+ // in case props have changed
+ patch(
+ child.vnode,
+ vnode,
+ container,
+ anchor,
+ instance,
+ parentSuspense,
+ isSVG,
+ optimized
+ )
queuePostRenderEffect(() => {
- const component = vnode.component!
- component.isDeactivated = false
- if (component.a) {
- invokeHooks(component.a)
+ child.isDeactivated = false
+ if (child.a) {
+ invokeHooks(child.a)
}
}, parentSuspense)
}
}
const key = vnode.key == null ? comp : vnode.key
- const cached = cache.get(key)
+ const cachedVNode = cache.get(key)
// clone vnode if it's reused because we are going to mutate it
if (vnode.el) {
}
cache.set(key, vnode)
- if (cached) {
+ if (cachedVNode) {
// copy over mounted state
- vnode.el = cached.el
- vnode.anchor = cached.anchor
- vnode.component = cached.component
+ vnode.el = cachedVNode.el
+ vnode.anchor = cachedVNode.anchor
+ vnode.component = cachedVNode.component
if (vnode.transition) {
// recursively update transition hooks on subTree
setTransitionHooks(vnode, vnode.transition!)