State Management
Créer des expériences utilisateur dynamiques et fluides nécessite souvent que l'état de votre application web soit reflété dans l'URL et conservé lors des événements de navigation dans le navigateur. Vous pouvez y parvenir sans recharger la page en utilisant les mises à jour des paramètres d'URL et la gestion d'état de l'historique du navigateur. Cela garantit que les utilisateurs peuvent partager, ajouter aux favoris ou revenir à des vues spécifiques, l'application étant pleinement consciente de leurs interactions antérieures.
Mise à jour de l'URL
Lorsque l'état d'une page web change, comme lors du filtrage d'une liste de produits ou de la navigation à travers différentes vues, vous devez souvent que l'URL reflète ces changements. Vous pouvez utiliser les méthodes replaceState
ou pushState
fournies par la classe BrowserHistory
pour manipuler l'URL sans recharger la page :
pushState
: Ajoute une nouvelle entrée à la pile d'historique du navigateur sans recharger la page. Cela est utile pour naviguer entre différentes vues ou contenus dynamiques.replaceState
: Met à jour l'entrée actuelle dans l'historique du navigateur sans ajouter une nouvelle entrée. Cela est idéal pour mettre à jour l'état dans la même vue.
Exemple : Mise à jour de l'URL avec des paramètres de requête
Dans cet exemple, lorsque le bouton "Mettre à jour l'URL" est cliqué, l'interface utilisateur est mise à jour pour montrer la catégorie sélectionnée et le tri, et l'URL est mise à jour avec de nouveaux paramètres de requête pour category
et sort
:
@Route(value = "products")
public class ProductView extends Composite<Div> {
Paragraph paragraph = new Paragraph();
Random random = new Random();
public ProductView() {
Button update = new Button("Update URL", ButtonTheme.PRIMARY);
update.onClick(ev -> {
filter("electronics", String.valueOf(random.nextInt(3) - 1));
});
Div div = getBoundComponent();
div.add(update);
div.add(paragraph);
}
public void filter(String category, String sort) {
// mettre à jour l'UI
updateUI(category, sort);
// mettre à jour l'URL
updateUrl(category, sort);
}
private void updateUI(String category, String sort) {
paragraph.setText("Affichage de la catégorie : " + category + " et tri par : " + sort);
}
private void updateUrl(String category, String sort) {
ParametersBag queryParameters = new ParametersBag();
queryParameters.put("category", category);
queryParameters.put("sort", sort);
Location newLocation = new Location("/products?" + queryParameters.getQueryString());
Router.getCurrent().getHistory()
// Mettre à jour l'URL sans recharger la page
.replaceState(null, newLocation);
}
}
Explication :
- Méthode
filter
: La méthode gère la mise à jour à la fois de l'UI et de l'URL en fonction de lacategory
et dusort
sélectionnés. - Méthode
updateUrl
: Cette méthode crée un nouveauParametersBag
pour les paramètres de requête, construit une nouvelle URL, puis utilisereplaceState
pour mettre à jour l'URL du navigateur sans recharger la page. replaceState
: Cette méthode change l'URL vers la nouvelle localisation tout en maintenant l'état actuel, sans provoquer un rechargement de la page.
Sauvegarde et restauration d'état dans l'historique du navigateur
En plus de mettre à jour l'URL, il est possible de sauvegarder des objets d'état arbitraires dans l'historique du navigateur. Cela signifie que vous pouvez stocker des données supplémentaires relatives à la vue actuelle (par exemple : saisies de formulaires, filtres, etc.) sans les intégrer directement dans l'URL.
Exemple : Sauvegarde de l'état de sélection
Dans l'exemple suivant, un ProfileView
se compose de plusieurs onglets (Profil, Commandes et Paramètres). Lorsque l'utilisateur change d'onglet, l'état de l'onglet sélectionné est sauvegardé dans l'historique du navigateur à l'aide de replaceState
. Cela permet à l'application de se souvenir du dernier onglet actif si l'utilisateur navigue de nouveau vers cette vue ou actualise la page.
@Route(value = "profile")
public class ProfileView extends Composite<Div> implements DidEnterObserver {
TabbedPane sections = new TabbedPane();
int currentSection = 0;
public ProfileView() {
sections.addTab("Profile");
sections.addTab("Orders");
sections.addTab("Settings");
sections.onSelect(ev -> {
currentSection = ev.getTabIndex();
// Sauvegarder l'état en utilisant replaceState
updateState(currentSection);
});
getBoundComponent().add(sections);
}
@Override
public void onDidEnter(DidEnterEvent event, ParametersBag parameters) {
// Essayer de récupérer la dernière section sauvegardée depuis l'état de l'historique du navigateur
Optional<Integer> lastSavedSection = event.getState(Integer.class);
// Si une section a été sauvegardée, restaurer la sélection de l'onglet
lastSavedSection.ifPresent(section -> sections.select(section));
}
private void updateState(int section) {
Router router = Router.getCurrent();
Location currentLocation = router.getHistory().getLocation().get();
// Mettre à jour l'état actuel avec la section sélectionnée
Router.getCurrent().getHistory()
.replaceState(section, currentLocation);
}
}
Explication :
- Composant TabbedPane : La vue se compose d'un composant
TabbedPane
, qui a trois onglets : Profil, Commandes et Paramètres. - Sauvegarde d'état lors du changement d'onglet : Chaque fois qu'un onglet est sélectionné, l'index de la section actuelle est sauvegardé dans l'historique du navigateur à l'aide de la méthode
replaceState
. - Restauration de l'état lors de la navigation : Lorsque l'utilisateur revient au
ProfileView
, l'application récupère la section sauvegardée depuis l'historique à l'aide deevent.getState()
et restaure la sélection correcte de l'onglet.