Lorsque vous naviguez sur une application SvelteKit, vous créez des _entrées d'historique_. Des clics sur les boutons "Précédent" et "Suivant" vont parcourir cette liste d'entrées, ré-exécutant tout fonction `load` concernées et remplaçant les composants de page lorsque nécessaire. Parfois, il est pratique de créer des entrées d'historique _sans_ naviguer. Par exemple, vous pourriez vouloir afficher une modale de dialogue que l'utilisateur ou l'utilisatrice puisse faire disparaître en appuyant sur le bouton "Précédent" du navigateur. Ceci est particulièrement utile sur les appareils mobiles, où utiliser les mouvements des doigts sont souvent plus naturels qu'interagire directement avec l'interface. Dans ces cas-là, une modale _non-associée_ à une entrée d'historique peut être une source de frustration, puisqu'un utilisateur ou utilisatrice pourrait faire glisser son doigt vers la gauche pour tenter de fermer la modale, pour au final se retrouver sur la mauvaise page. SvelteKit rend cela possible grâce aux fonctions [`pushState`]($app-navigation#pushState) et [`replaceState`]($app-navigation#replaceState), qui vous permettent d'associer un état avec une entrée d'historique sans avoir à naviguer. Par exemple, pour implémenter une modale liée à l'historique : ```svelte {#if page.state.showModal} history.back()} /> {/if} ``` La modale peut être fermée en naviguant vers l'arrière (en désactivant `page.state.showModal`) ou en interagissant avec elle de sorte à exécuter le callback `close`, ce qui déclenchera la navigation arrière programmatiquement. ## API Le premier argument de `pushState` est l'URL, relative à l'URL courante. Pour rester sur l'URL courante, utilisez `''`. Le deuxième argument est l'état de la nouvelle page, auquel vous pouvez avoir accès via l'[objet de page]($app-state#page) en tant que `page.state`. Vous pouvez typer l'état de page en déclarant une interface [`App.PageState`](types#PageState) (en général dans `src/app.d.ts`). Pour définir l'état de page sans créer une nouvelle entrée d'historique, utilisez `replaceState` plutôt que `pushState`. > [!LEGACY] > `page.state` importé depuis `$app/state` a été ajouté dans la version 2.12 de SvelteKit. Si vous > utilisez une version antérieure ou si vous utilisez Svelte 4, utilisez plutôt `$page.state` > importé depuis `$app/stores`. ## Charger des données pour une route [!VO]Loading data for a route Lorsque vous utilisez le shallow routing, vous pourriez vouloir afficher une autre `+page.svelte` à l'intérieur de la page courante. Par exemple, on peut imaginer un clic sur une vignette de photo qui viendrait afficher le détail de la photo sans avoir à naviguer vers la page de la photo. Pour que cela fonctionne, vous avez besoin de charger les données attendues par `+page.svelte`. Une manière pratique de faire cela est d'utiliser la fonction [`preloadData`]($app-navigation#preloadData) au sein du gestionnaire de `click` d'un élément ``. Si l'élément (ou un parent) utilise [`data-sveltekit-preload-data`](link-options#data-sveltekit-preload-data), les données auront déjà été demandées, et `preloadData` utilisera alors cette requête. ```svelte {#each data.thumbnails as thumbnail} { if (innerWidth < 640 // ignore si l'écran est trop petit || e.shiftKey // ou si le lien est ouvert dans une autre fenêtre || e.metaKey || e.ctrlKey // ou un nouvel onglet (mac: metaKey, win/linux: ctrlKey) // on devrait en théorie également considérer un clic avec le bouton de défilement de la // souris ) return; // empêche la navigation e.preventDefault(); const { href } = e.currentTarget; // ré-exécute les fonctions `load` (ou plutôt, récupère le résultat des fonctions `load` qui // sont déjà en cours à cause de `data-sveltekit-preload-data`) const result = await preloadData(href); if (result.type === 'loaded' && result.status === 200) { pushState(href, { selected: result.data }); } else { // quelque chose s'est mal passé ! on essaie de naviguer goto(href); } }} > {thumbnail.alt} {/each} {#if page.state.selected} history.back()}> {/if} ``` ## Inconvénients [!VO]Caveats Lors du rendu côté serveur,`page.state` est toujours un objet vide. C'est également le cas pour la première page sur laquelle l'utilisateur ou l'utilisatrice arrive — si cette personne recharge la page (ou revient depuis un autre site), l'état ne sera _pas_ appliqué avant la navigation suivante. During server-side rendering, `page.state` is always an empty object. The same is true for the fir Le shallow routing est une fonctionnalité qui nécessite JavaScript pour fonctionner. Soyez-en conscient•e lorsque vous vous en servez et essayez de penser à un comportement de remplacement dans les cas où JavaScript ne serait pas disponible.