State Management
Luodakseen saumattomia, dynaamisia käyttäjäkokemuksia, vaaditaan usein, että verkkosovelluksen tila heijastuu URL-osoitteessa ja säilyy selaimen navigointitapahtumien aikana. Voit saavuttaa tämän ilman sivun lataamista hyödyntämällä URL-parametrien päivityksiä ja selaushistorian tilan hallintaa. Tämä varmistaa, että käyttäjät voivat jakaa, lisätä kirjanmerkkejä tai palata tiettyihin näkymiin, joista sovellus on täysin tietoinen heidän aiemmista vuorovaikutuksistaan.
URL:n päivittäminen
Kun verkkosivun tila muuttuu, kuten tuotteiden listauksen suodattamisessa tai eri näkymien välillä navigoimassa, tarvitset usein, että URL heijastaa näitä muutoksia. Voit käyttää replaceState tai pushState -menetelmiä, joita BrowserHistory-luokka tarjoaa, muokataksesi URL:ia ilman sivun lataamista:
pushState: Lisää uuden merkinnän selaimen historiakärryyn ilman sivun lataamista. Tämä on hyödyllistä, kun navigoidaan erilaisten näkymien tai dynaamisen sisällön välillä.replaceState: Päivittää nykyisen merkinnän selaimen historiassa lisäämättä uutta merkintää. Tämä on ihanteellinen tilan päivittämiseen samalla näkymällä.
Esimerkki: URL:n päivittäminen kyselyparametrien avulla
Tässä esimerkissä, kun "Päivitä URL" -painiketta napsautetaan, käyttöliittymä päivitetään näyttämään valittu kategoria ja lajittelu, ja URL päivitetään uusilla kyselyparametreilla category ja sort:
@Route(value = "products")
public class ProductView extends Composite<Div> {
private final Div self = getBoundComponent();
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));
});
self.add(update);
self.add(paragraph);
}
public void filter(String category, String sort) {
// päivittää käyttöliittymän
updateUI(category, sort);
// päivittää URL:n
updateUrl(category, sort);
}
private void updateUI(String category, String sort) {
paragraph.setText("Näytetään kategoria: " + category + " ja lajitellaan: " + 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()
// Päivittää URL:n ilman sivun lataamista
.replaceState(null, newLocation);
}
}
Selitys:
filter-metodi: Metodi käsittelee sekä käyttöliittymän että URL:n päivittämistä valituncategoryjasortmukaan.updateUrl-metodi: Tämä metodi luo uudenParametersBagkyselyparametreille, rakentaa uuden URL:n ja käyttää sittenreplaceState-menetelmää päivittääkseen selaimen URL:n ilman sivun lataamista.replaceState: Tämä metodi muuttaa URL:n uudeksi sijainniksi säilyttäen nykyisen tilan ilman sivun uudelleen lataamista.
Tilanteen tallentaminen ja palauttaminen selaimen historiassa
URL:n päivittämisen lisäksi on mahdollista tallentaa mielivaltaisia tiloja selaimen historiaan. Tämä tarkoittaa, että voit säilyttää lisätietoja nykyisestä näkymästä (esimerkiksi lomakekentät, suodattimet jne.) ilman, että niitä upotetaan suoraan URL:iin.
Esimerkki: Valinnan tilan tallentaminen
Seuraavassa esimerkissä ProfileView koostuu useista väliotsikoista (Profiili, Tilaukset ja Asetukset). Kun käyttäjä vaihtaa välilehtiä, valitun välilehden tila tallennetaan selaimen historiaan käyttäen replaceState-menetelmää. Tämä mahdollistaa sovelluksen muistavan viimeksi aktiivisen välilehden, jos käyttäjä navigoi takaisin tähän näkymään tai päivittää sivun.
@Route(value = "profile")
public class ProfileView extends Composite<Div> implements DidEnterObserver {
private final Div self = getBoundComponent();
TabbedPane sections = new TabbedPane();
int currentSection = 0;
public ProfileView() {
sections.addTab("Profile");
sections.addTab("Orders");
sections.addTab("Settings");
sections.onSelect(ev -> {
currentSection = ev.getTabIndex();
// Tallenna tila käyttäen replaceState
updateState(currentSection);
});
self.add(sections);
}
@Override
public void onDidEnter(DidEnterEvent event, ParametersBag parameters) {
// Yritetään palauttaa viimeksi tallennettu osio selaimen historiasta
Optional<Integer> lastSavedSection = event.getState(Integer.class);
// Jos osio oli tallennettu, palautetaan välilehden valinta
lastSavedSection.ifPresent(section -> sections.select(section));
}
private void updateState(int section) {
Router router = Router.getCurrent();
Location currentLocation = router.getHistory().getLocation().get();
// Päivitä nykyinen tila valittuun osioon
Router.getCurrent().getHistory()
.replaceState(section, currentLocation);
}
}
Selitys:
- TabbedPane-komponentti: Näkymä koostuu
TabbedPane-komponentista, jossa on kolme välilehteä: Profiili, Tilaukset ja Asetukset. - Tilannetta tallentaminen välilehden vaihdossa: Joka kerta kun välilehti valitaan, nykyinen osioindeksi tallennetaan selaimen historiaan käyttäen
replaceState-menetelmää. - Tilanteen palauttaminen navigoinnin yhteydessä: Kun käyttäjä navigoi takaisin
ProfileView-näkymään, sovellus palauttaa tallennetun osion historiasta käyttäenevent.getState()-menetelmää ja palauttaa oikean välilehden valinnan.