Skip to content

Commit fb96ab5

Browse files
snowwolfjayliamdebeasi
andauthoredNov 23, 2021
fix(vue): ionic lifecycle hooks now run when using vue 3.2 setup syntax (#24253)
resolves #23824 Co-authored-by: Liam DeBeasi <liamdebeasi@icloud.com>
1 parent 6f01c3b commit fb96ab5

File tree

5 files changed

+122
-5
lines changed

5 files changed

+122
-5
lines changed
 

‎packages/vue/src/hooks.ts

+6
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ const injectHook = (lifecycleType: LifecycleHooks, hook: Function, component: Co
8080
// Add to public instance so it is accessible to IonRouterOutlet
8181
const target = component as any;
8282
const hooks = target.proxy[lifecycleType] || (target.proxy[lifecycleType] = []);
83+
/**
84+
* Define property on public instances using `setup` syntax in Vue 3.x
85+
*/
86+
if (target.exposed) {
87+
target.exposed[lifecycleType] = hooks;
88+
}
8389
const wrappedHook = (...args: unknown[]) => {
8490
if (target.isUnmounted) {
8591
return;

‎packages/vue/test-app/src/router/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ const routes: Array<RouteRecordRaw> = [
1717
path: '/lifecycle',
1818
component: () => import('@/views/Lifecycle.vue')
1919
},
20+
{
21+
path: '/lifecycle-setup',
22+
component: () => import('@/views/LifecycleSetup.vue')
23+
},
2024
{
2125
path: '/overlays',
2226
name: 'Overlays',

‎packages/vue/test-app/src/views/Home.vue

+3
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
4747
<ion-item button router-link="/lifecycle" id="lifecycle">
4848
<ion-label>Lifecycle</ion-label>
4949
</ion-item>
50+
<ion-item button router-link="/lifecycle-setup" id="lifecycle-setup">
51+
<ion-label>Lifecycle (Setup)</ion-label>
52+
</ion-item>
5053
<ion-item button router-link="/delayed-redirect" id="delayed-redirect">
5154
<ion-label>Delayed Redirect</ion-label>
5255
</ion-item>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<template>
2+
<ion-page data-pageid="lifecycle-setup">
3+
<ion-header :translucent="true">
4+
<ion-toolbar>
5+
<ion-buttons>
6+
<ion-back-button></ion-back-button>
7+
</ion-buttons>
8+
<ion-title>Lifecycle (Setup)</ion-title>
9+
</ion-toolbar>
10+
</ion-header>
11+
12+
<ion-content :fullscreen="true">
13+
<ion-header collapse="condense">
14+
<ion-toolbar>
15+
<ion-title size="large">Lifecycle (Setup)</ion-title>
16+
</ion-toolbar>
17+
</ion-header>
18+
19+
<div class="ion-padding">
20+
onIonViewWillEnter: <div id="onWillEnter">{{ onWillEnter }}</div><br />
21+
onIonViewDidEnter: <div id="onDidEnter">{{ onDidEnter }}</div><br />
22+
onIonViewWillLeave: <div id="onWillLeave">{{ onWillLeave }}</div><br />
23+
onIonViewDidLeave: <div id="onDidLeave">{{ onDidLeave }}</div><br />
24+
25+
<ion-button router-link="/navigation" id="lifecycle-navigation">Go to another page</ion-button>
26+
</div>
27+
</ion-content>
28+
</ion-page>
29+
</template>
30+
31+
<script lang="ts" setup>
32+
import {
33+
IonButton,
34+
IonBackButton,
35+
IonButtons,
36+
IonContent,
37+
IonHeader,
38+
IonPage,
39+
IonTitle,
40+
IonToolbar,
41+
onIonViewWillEnter,
42+
onIonViewDidEnter,
43+
onIonViewWillLeave,
44+
onIonViewDidLeave
45+
} from '@ionic/vue';
46+
import { ref } from 'vue';
47+
const onWillEnter = ref(0);
48+
const onDidEnter = ref(0);
49+
const onWillLeave = ref(0);
50+
const onDidLeave = ref(0);
51+
52+
onIonViewWillEnter(() => onWillEnter.value += 1);
53+
onIonViewDidEnter(() => onDidEnter.value += 1);
54+
onIonViewWillLeave(() => onWillLeave.value += 1);
55+
onIonViewDidLeave(() => onDidLeave.value += 1);
56+
</script>

‎packages/vue/test-app/tests/e2e/specs/lifecycle.js

+53-5
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,62 @@ describe('Lifecycle', () => {
5555
onIonViewDidLeave: 0
5656
});
5757
});
58+
59+
it('should fire lifecycle events when navigating to and from a page - setup', () => {
60+
cy.visit('http://localhost:8080');
61+
cy.get('#lifecycle-setup').click();
62+
63+
testLifecycle('lifecycle-setup', {
64+
onIonViewWillEnter: 1,
65+
onIonViewDidEnter: 1,
66+
onIonViewWillLeave: 0,
67+
onIonViewDidLeave: 0
68+
});
69+
70+
cy.get('#lifecycle-navigation').click();
71+
72+
testLifecycle('lifecycle-setup', {
73+
onIonViewWillEnter: 1,
74+
onIonViewDidEnter: 1,
75+
onIonViewWillLeave: 1,
76+
onIonViewDidLeave: 1
77+
});
78+
79+
cy.ionBackClick('navigation');
80+
81+
testLifecycle('lifecycle-setup', {
82+
onIonViewWillEnter: 2,
83+
onIonViewDidEnter: 2,
84+
onIonViewWillLeave: 1,
85+
onIonViewDidLeave: 1
86+
});
87+
});
88+
89+
it('should fire lifecycle events when landed on directly - setup', () => {
90+
cy.visit('http://localhost:8080/lifecycle-setup');
91+
92+
testLifecycle('lifecycle-setup', {
93+
onIonViewWillEnter: 1,
94+
onIonViewDidEnter: 1,
95+
onIonViewWillLeave: 0,
96+
onIonViewDidLeave: 0
97+
});
98+
});
5899
})
59100

60101
const testLifecycle = (selector, expected = {}) => {
61-
cy.get(`[data-pageid=${selector}] #willEnter`).should('have.text', expected.ionViewWillEnter);
62-
cy.get(`[data-pageid=${selector}] #didEnter`).should('have.text', expected.ionViewDidEnter);
63-
cy.get(`[data-pageid=${selector}] #willLeave`).should('have.text', expected.ionViewWillLeave);
64-
cy.get(`[data-pageid=${selector}] #didLeave`).should('have.text', expected.ionViewDidLeave);
65-
102+
if (expected.ionViewWillEnter) {
103+
cy.get(`[data-pageid=${selector}] #willEnter`).should('have.text', expected.ionViewWillEnter);
104+
}
105+
if (expected.ionViewDidEnter) {
106+
cy.get(`[data-pageid=${selector}] #didEnter`).should('have.text', expected.ionViewDidEnter);
107+
}
108+
if (expected.ionViewWillLeave) {
109+
cy.get(`[data-pageid=${selector}] #willLeave`).should('have.text', expected.ionViewWillLeave);
110+
}
111+
if (expected.ionViewDidLeave) {
112+
cy.get(`[data-pageid=${selector}] #didLeave`).should('have.text', expected.ionViewDidLeave);
113+
}
66114
cy.get(`[data-pageid=${selector}] #onWillEnter`).should('have.text', expected.onIonViewWillEnter);
67115
cy.get(`[data-pageid=${selector}] #onDidEnter`).should('have.text', expected.onIonViewDidEnter);
68116
cy.get(`[data-pageid=${selector}] #onWillLeave`).should('have.text', expected.onIonViewWillLeave);

0 commit comments

Comments
 (0)
Please sign in to comment.