đ§ 3.5 Navigation dans une application Ionic-Vue
-
La navigation est un pilier dâune app mobile
-
On travaille avec :
- des écrans
- des piles de navigation
- des transitions animées
-
Ionic-Vue sâappuie sur Vue Router + une couche Ionic
- pour garantir une expérience native sur Android / iOS
đŻ Objectifs d'apprentissage
Ă la fin du chapitre, vous serez capables de :
-
Expliquer navigation linéaire vs non-linéaire
-
Expliquer le rĂŽle de Vue Router dans Ionic-Vue
-
Structurer un router adapté au mobile
-
Implémenter les patterns courants :
- Stack, Tabs, Menu
-
Naviguer avec / sans paramĂštres
-
ContrĂŽler :
- les transitions
- le bouton retour
-
Ăviter les erreurs classiques de navigation hybride
đ Web vs đ± Mobile
Pourquoi la navigation est différente ?
Web classique :
- Navigation basée sur les URLs
- Historique linéaire
- Bouton retour = page précédente
Mobile :
-
Logique dâĂ©crans
-
Organisation en piles (stacks)
-
Transitions animées natives
-
Bouton retour matériel / gestuel
-
Comportement cohérent avec :
- iOS (swipe back)
- Android (back button)
đ Ionic adopte une logique mobile-first, mĂȘme avec Vue Router dessous.
đ§ 3.5.1 Principe gĂ©nĂ©ral
Vue Router vs Ionic
Vue Router décide :
- oĂč lâapp doit naviguer
- Définition des routes
- Gestion des URLs
- Passage de paramĂštres
- Navigation programmée :
router.push(),router.replace(), etc.
RĂŽle dâIonic (IonRouterOutlet)
Ionic décide :
- comment la navigation est vĂ©cue par lâutilisateur
- Gestion de la pile de navigation
- Transitions animées natives
- Bouton retour Android
- Swipe back iOS
- Conservation de lâĂ©tat des pages
<IonRouterOutlet> :
- remplace le
<router-view />classique - permet Ă Ionic de contrĂŽler le cycle de vie des pages
Ă retenir
Vue Router dĂ©cide oĂč aller. Ionic dĂ©cide comment on y va.
đșïž 3.5.2 Navigation linĂ©aire vs non-linĂ©aire
Navigation linéaire (Linear routing)
- Parcours séquentiel : écran aprÚs écran
- Les écrans sont empilés dans une stack
- Le bouton retour revient Ă lâĂ©cran prĂ©cĂ©dent
- Chemin souvent unique
Navigation linĂ©aire â Exemple
Exemples typiques :
-
Onboarding :
- Accueil â PrĂ©sentation â Inscription
-
Formulaire multi-étapes :
- Infos perso â Adresse â Paiement
-
Liste â DĂ©tail â Ădition
En Ionic :
-
ion-router-outletgĂšre la pile -
router.push()pour avancer - Bouton retour (Android / iOS) pour revenir
đ Câest la forme la plus proche du comportement natif.
Limite de la navigation linéaire
-
Ne gÚre pas bien les expériences plus complexes :
- onglets (
Tabs) - sections parallĂšles
- onglets (
-
Difficile Ă utiliser pour des UIs avec plusieurs sections principales
Câest lĂ que la navigation non-linĂ©aire intervient.
Navigation non-linéaire (Non-linear routing)
- Lâutilisateur ne suit pas un chemin unique
- Peut changer de section Ă tout moment
- Chaque section a sa propre pile dâĂ©crans
- Le bouton retour reste dans la section courante
Exemple non-linéaire (Tabs)
Scénario (simplifié) :
- Onglet Originals
- On ouvre la vue Ted Lasso
- On change dâonglet â Search
- On revient sur Originals â on revoit Ted Lasso
- Le bouton retour ramĂšne Ă Originals (liste), pas Ă Search
Pourquoi ?
- Chaque onglet est une pile indépendante
- Le bouton retour ne change pas de tab, il remonte la pile de cet onglet
Attention Ă router.go(-1)
-
En non-linéaire,
router.go(-1)peut :- revenir Ă une mauvaise page
- casser la logique des piles par onglet
-
Les APIs type
router.go()sont faites pour un historique linéaire
đ Avec Ionic + Tabs â il faut laisser Ionic gĂ©rer la pile.
SynthÚse : linéaire vs non-linéaire
Navigation linéaire
- Stack unique
- Retour = page précédente
- Flux simples / guidés
Navigation non-linéaire
- Plusieurs stacks (par onglet, par menu)
- Retour reste dans la stack courante
- Flux complexes, multi-sections
Quel pattern pour quel usage ?
| Pattern | Type | Usage recommandé |
|---|---|---|
| Stack | Linéaire | Détails, formulaires, parcours guidés |
| Tabs | Non-linĂ©aire | Sections principales de lâapplication |
| Menu | Non-linéaire | Sections secondaires / navigation globale |
On peut combiner les patterns, mais il faut garder une logique claire.
đ 3.5.3 Structure du router Ionic-Vue
Fichier principal
-
Configuration dans :
src/router/index.ts -
On utilise :
createRoutercreateWebHistoryRouteRecordRaw
Exemple avec Tabs
// src/router/index.ts
import { createRouter, createWebHistory } from '@ionic/vue-router'
import type { RouteRecordRaw } from 'vue-router'
const routes: RouteRecordRaw[] = [
{
path: '/',
redirect: '/tabs/home'
},
{
path: '/tabs/',
component: () => import('@/views/TabsPage.vue'),
children: [
{
path: 'home',
component: () => import('@/views/HomePage.vue')
},
{
path: 'settings',
component: () => import('@/views/SettingsPage.vue')
}
]
}
]
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes
})
export default router
Bonnes pratiques router
-
DĂ©finir un point dâentrĂ©e clair (
redirect) -
Utiliser le lazy loading :
() => import('...')
-
Laisser
IonRouterOutletgĂ©rer :- pile dâĂ©crans
- animations
- état des pages
đ 3.5.4 Navigation par onglets (Tabs)
Composants utilisés
-
ion-tabs: conteneur des onglets -
ion-tab-bar: barre dâonglets (souvent en bas) -
ion-tab-button: bouton dâonglet -
ion-router-outlet: zone qui change selon la route
Exemple Tabs
<template>
<ion-tabs>
<ion-router-outlet />
<ion-tab-bar slot="bottom">
<ion-tab-button tab="home" href="/tabs/home">
<ion-label>Accueil</ion-label>
</ion-tab-button>
<ion-tab-button tab="settings" href="/tabs/settings">
<ion-label>ParamĂštres</ion-label>
</ion-tab-button>
</ion-tab-bar>
</ion-tabs>
</template>
Comportement des Tabs
-
Chaque onglet a sa propre stack
-
Changer dâonglet ne vide pas lâhistorique
-
Le bouton retour :
- reste dans lâonglet courant
- remonte lâhistorique de cet onglet
đ 3.5.5 Navigation entre pages (Stack)
Navigation programmée (Vue Router)
import { useRouter } from 'vue-router'
const router = useRouter()
function goToDetails () {
router.push('/details')
}
Navigation déclarative (router-link)
<ion-button router-link="/details">
Voir détails
</ion-button>
Avantages :
- Simple
- Lisible
Limites :
-
Pas de logique avant la navigation :
- pas de validation de formulaire
- pas de confirmation
đ§ 3.5.6 useIonRouter â Navigation avancĂ©e
Pourquoi useIonRouter ?
-
router-link:- ne permet pas dâexĂ©cuter du code avant navigation
-
router.pushseul :- ne contrĂŽle pas les animations Ionic
useIonRouter combine :
- la navigation programmée
- avec le contrĂŽle des transitions mobiles
Exemple useIonRouter
import { useIonRouter } from '@ionic/vue'
const ionRouter = useIonRouter()
function goToDetails () {
// ex : valider un formulaire avant
ionRouter.push('/details', 'forward')
}
-
2á” paramĂštre = direction :
'forward''back''root'
đ Permet de rester cohĂ©rent avec les animations natives (push / pop).
đ 3.5.7 Passage de paramĂštres
Route paramétrée
{
path: '/notes/:id',
component: () => import('@/views/NoteDetailPage.vue')
}
Navigation avec paramĂštre
router.push(`/notes/${note.id}`)
Récupération du paramÚtre
import { useRoute } from 'vue-router'
const route = useRoute()
const noteId = route.params.id
On peut ensuite charger la note correspondante (API, store, etc.).
đ 3.5.8 Retour & transitions
Gestion automatique par Ionic
- Bouton retour Android
- Swipe back iOS
- Transitions cohérentes avec la plateforme
Bouton retour dans le header
<ion-header>
<ion-toolbar>
<ion-buttons slot="start">
<ion-back-button default-href="/tabs/home" />
</ion-buttons>
<ion-title>Détail</ion-title>
</ion-toolbar>
</ion-header>
-
default-href: route utilisée si la pile est vide
à éviter absolument
window.history.back()router.go(-1)
Pourquoi ?
-
Contournent la pile Ionic
-
Peuvent provoquer des retours :
- vers le mauvais onglet
- vers des écrans inactifs
đ Toujours laisser Ionic gĂ©rer la navigation mobile.
đ 3.5.9 Menu latĂ©ral (Side Menu)
Exemple simple
<ion-menu content-id="main-content">
<ion-header>
<ion-toolbar>
<ion-title>Menu</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-list>
<ion-item router-link="/tabs/home">Accueil</ion-item>
<ion-item router-link="/tabs/settings">ParamĂštres</ion-item>
</ion-list>
</ion-content>
</ion-menu>
<ion-router-outlet id="main-content" />
Side Menu â Remarques
-
Utile pour :
- sections secondaires
- navigation globale
-
à éviter :
- combiner Tabs + Menu sans logique claire
-
Attention Ă :
- ne pas multiplier les patterns dans tous les sens
đ ïž 3.5.10 Bonnes pratiques & erreurs
Bonnes pratiques
-
Penser mobile-first
-
Choisir un pattern principal :
- Tabs ou Menu ou Stack
-
Laisser Ionic gérer :
- la pile
- les transitions
- le retour
Erreurs fréquentes
-
Mélanger :
- Tabs + Menu + navigations custom
-
Manipuler manuellement lâhistorique
-
Utiliser uniquement la logique âwebâ :
- raisonner en URL
- oublier la notion de stack mobile
-
Utiliser
router.go(-1)dans un contexte Tabs
đ§Ș 3.5.11 ActivitĂ© pratique
Mini flow de navigation
Objectifs :
-
Créer une page Liste (ex : liste de notes / tùches)
-
Créer une page Détail
-
Mettre en place la navigation :
- Liste â DĂ©tail avec un paramĂštre (id)
-
Ajouter un bouton retour fonctionnel
-
Tester :
- dans le navigateur (
ionic serve) - sur émulateur / téléphone si possible
- dans le navigateur (
Bonus : utiliser
useIonRouterpour contrĂŽler les transitions.