From 2190aaec846a72f25421446cefd13950abc81881 Mon Sep 17 00:00:00 2001 From: Michael Tintiuc Date: Mon, 17 Jun 2019 17:34:06 +0300 Subject: [PATCH] Add keep-alive functionality --- vue/src/components/ion-vue-router.ts | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/vue/src/components/ion-vue-router.ts b/vue/src/components/ion-vue-router.ts index 30f7b31b527..55cf9238090 100644 --- a/vue/src/components/ion-vue-router.ts +++ b/vue/src/components/ion-vue-router.ts @@ -1,12 +1,19 @@ -import Vue, { CreateElement, RenderContext, VNodeData } from 'vue'; +import Vue, { CreateElement, RenderContext, VNode, VNodeData } from 'vue'; import { NavDirection } from '@ionic/core'; type TransitionDone = () => void; + interface Props { name: string; animated: boolean; } +interface KeepAliveProps { + include?: string | string[] | RegExp; + exclude?: string | string[] | RegExp; + max?: number; +} + // Component entering the view let enteringEl: HTMLElement; @@ -19,6 +26,8 @@ export default { name: { default: 'default', type: String }, // Disable transitions animated: { default: true, type: Boolean }, + // keep-alive props + keepAlive: { type: [String, Object as () => KeepAliveProps] }, }, render(h: CreateElement, { parent, props, data, children }: RenderContext) { @@ -47,12 +56,11 @@ export default { leaveCancelled, } }; + const routerViewNode: VNode = h('router-view', routerViewData, children); + const keepAliveNode: VNode = h('keep-alive', { props: { ...props.keepAlive } }, [routerViewNode]); + const transitionNode: VNode = h('transition', transitionData, [props.keepAlive === undefined ? routerViewNode : keepAliveNode]); - return h('ion-router-outlet', ionRouterOutletData, [ - h('transition', transitionData, [ - h('router-view', routerViewData, children) - ]) - ]); + return h('ion-router-outlet', ionRouterOutletData, [transitionNode]); } };