La navigation est un pilier dâune app mobile
On travaille avec :
Ionic-Vue sâappuie sur Vue Router + une couche Ionic
Ă 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 :
Naviguer avec / sans paramĂštres
ContrĂŽler :
Ăviter les erreurs classiques de navigation hybride
Web classique :
Mobile :
Logique dâĂ©crans
Organisation en piles (stacks)
Transitions animées natives
Bouton retour matériel / gestuel
Comportement cohérent avec :
đ Ionic adopte une logique mobile-first, mĂȘme avec Vue Router dessous.
Vue Router décide :
router.push(), router.replace(), etc.Ionic décide :
<IonRouterOutlet> :
<router-view /> classiqueVue Router dĂ©cide oĂč aller. Ionic dĂ©cide comment on y va.
Exemples typiques :
Onboarding :
Formulaire multi-étapes :
Liste â DĂ©tail â Ădition
En Ionic :
ion-router-outlet gĂšre la pile
router.push() pour avancerđ Câest la forme la plus proche du comportement natif.
Ne gÚre pas bien les expériences plus complexes :
Tabs)Difficile Ă utiliser pour des UIs avec plusieurs sections principales
Câest lĂ que la navigation non-linĂ©aire intervient.
Scénario (simplifié) :
Pourquoi ?
router.go(-1)
En non-linéaire, router.go(-1) peut :
Les APIs type router.go() sont faites pour un historique linéaire
đ Avec Ionic + Tabs â il faut laisser Ionic gĂ©rer la pile.
Navigation linéaire
Navigation non-linéaire
| 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.
Configuration dans :
src/router/index.ts
On utilise :
createRoutercreateWebHistoryRouteRecordRaw// 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
DĂ©finir un point dâentrĂ©e clair (redirect)
Utiliser le lazy loading :
() => import('...')Laisser IonRouterOutlet gérer :
ion-tabs : conteneur des ongletsion-tab-bar : barre dâonglets (souvent en bas)ion-tab-button : bouton dâongletion-router-outlet : zone qui change selon la route<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>
Chaque onglet a sa propre stack
Changer dâonglet ne vide pas lâhistorique
Le bouton retour :
import { useRouter } from 'vue-router'
const router = useRouter()
function goToDetails () {
router.push('/details')
}
router-link)<ion-button router-link="/details">
Voir détails
</ion-button>
Avantages :
Limites :
Pas de logique avant la navigation :
useIonRouter â Navigation avancĂ©euseIonRouter ?router-link :
router.push seul :
useIonRouter combine :
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).
{
path: '/notes/:id',
component: () => import('@/views/NoteDetailPage.vue')
}
router.push(`/notes/${note.id}`)
import { useRoute } from 'vue-router'
const route = useRoute()
const noteId = route.params.id
On peut ensuite charger la note correspondante (API, store, etc.).
<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 videwindow.history.back()router.go(-1)Pourquoi ?
Contournent la pile Ionic
Peuvent provoquer des retours :
đ Toujours laisser Ionic gĂ©rer la navigation mobile.
<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" />
Utile pour :
à éviter :
Attention Ă :
Penser mobile-first
Choisir un pattern principal :
Laisser Ionic gérer :
Mélanger :
Manipuler manuellement lâhistorique
Utiliser uniquement la logique âwebâ :
Utiliser router.go(-1) dans un contexte Tabs
Objectifs :
Créer une page Liste (ex : liste de notes / tùches)
Créer une page Détail
Mettre en place la navigation :
Ajouter un bouton retour fonctionnel
Tester :
ionic serve)Bonus : utiliser
useIonRouterpour contrĂŽler les transitions.