Route Outlets
Een outlet is een aangewezen component, ofwel een route lay-out of een route weergave, waar kindroutes dynamisch worden weergegeven. Het definieert waar de inhoud van de kindroute zal verschijnen binnen de ouderroute. Outlets zijn fundamenteel voor het creëren van modulaire, geneste gebruikersinterfaces en flexibele navigatiestructuren.
Een outlet definiëren
Outlets worden doorgaans geïmplementeerd met behulp van containercomponenten die kindinhoud kunnen vasthouden en beheren. In webforJ kan elke component die de HasComponents
interface implementeert, of een samengesteld geheel van dergelijke componenten, dienen als een outlet. Bijvoorbeeld, FlexLayout
implementeert de HasComponents
interface, waardoor het een geldige outlet is voor kindroutes.
Als er geen outlet expliciet is gedefinieerd voor een route, wordt het eerste Frame
van de app gebruikt als de standaard outlet. Dit gedrag zorgt ervoor dat elke kindroute een plaats heeft om weergegeven te worden.
In toepassingen met meerdere frames, kunt u specificeren welk frame als de outlet voor kindroutes moet worden gebruikt door de frame
-eigenschap in de @Route
annotatie in te stellen. De frame
-eigenschap accepteert de naam van het frame dat moet worden gebruikt voor weergave.
Voorbeeld:
@Route
public class MainLayout extends Composite<AppLayout> {
public MainLayout() {
setHeader();
setDrawer();
}
}
@Route(outlet = MainLayout.class)
public class DashboardView extends Composite<Div> {
public DashboardView() {
getBoundComponent().add(new H1("Dashboard Inhoud"));
}
}
In dit voorbeeld:
MainLayout
fungeert als de lay-outcontainer, maar aangezien er geen specifieke outlet is gedefinieerd, wordt de standaardFrame
van de app gebruikt.- De
DashboardView
wordt weergegeven binnenMainLayout
met behulp van de standaard outlet (inhoudsgebied) van deAppLayout
.
Kindroutes van MainLayout
zullen automatisch worden weergegeven in de inhoudsslot van AppLayout
, tenzij een andere outlet of frame is gespecificeerd.
Outlet levenscyclus
Outlets zijn nauw verbonden met de levenscyclus van routes. Wanneer de actieve route verandert, werkt de outlet zijn inhoud dynamisch bij door de juiste kindcomponent in te voegen en componenten die niet langer nodig zijn te verwijderen. Dit zorgt ervoor dat alleen de relevante weergaven op elk gegeven moment worden weergegeven.
- Creatie: Outlets worden geïnitialiseerd voordat kindcomponenten worden aangemaakt.
- Inhoud Invoegen: Wanneer een kindroute is gematcht, wordt de component in de outlet geïnjecteerd.
- Bijwerken: Bij het navigeren tussen routes, werkt de outlet zijn inhoud bij, waarbij de nieuwe kindcomponent wordt ingevoegd en verouderde componenten worden verwijderd.
Aangepaste outlets
De RouteOutlet
interface is verantwoordelijk voor het beheren van de levenscyclus van routecomponenten, en bepaalt hoe componenten worden weergegeven en verwijderd. Elke component die deze interface implementeert, kan als een outlet voor andere componenten fungeren.
Belangrijke methoden in RouteOutlet
:
showRouteContent(Component component)
: Verantwoordelijk voor het weergeven van de opgegeven component in de outlet. Dit wordt aangeroepen wanneer de router een route matcht en de kindcomponent moet worden weergegeven.removeRouteContent(Component component)
: Behandelt het verwijderen van de component uit de outlet, meestal aangeroepen bij het navigeren weg van de huidige route.
Door RouteOutlet
te implementeren, kunnen ontwikkelaars bepalen hoe routes in specifieke gebieden van de app worden geïnjecteerd. bijvoorbeeld
import com.webforj.router.RouteOutlet;
public class MainLayout extends Composite<AppLayout> implements RouteOutlet {
@Override
public void showRouteContent(Component component) {
AppLayout layout = getBoundComponent();
layout.addToDrawer(component);
}
@Override
public void removeRouteContent(Component component) {
AppLayout layout = getBoundComponent();
layout.remove(component);
}
}
In dit voorbeeld implementeert de MainLayout
klasse de RouteOutlet
interface, waardoor componenten dynamisch aan of verwijderd kunnen worden uit de lade van de AppLayout op basis van de routenavigatie in plaats van het standaard inhoudsgebied dat is gedefinieerd in de AppLayout
component.
Caching van outletcomponenten
Standaard voegen outlets dynamisch componenten toe en verwijderen ze deze bij het navigeren naar en van routes. In bepaalde gevallen—bijvoorbeeld voor weergaven met complexe componenten—kan het echter beter zijn om de zichtbaarheid van componenten te toggelen in plaats van ze volledig uit de DOM te verwijderen. Dit is waar de PersistentRouteOutlet
in het spel komt, waardoor componenten in het geheugen blijven en simpelweg verborgen of getoond worden, in plaats van vernietigd en opnieuw aangemaakt te worden.
De PersistentRouteOutlet
cachet weergegeven componenten, waardoor ze in het geheugen blijven wanneer de gebruiker wegnavigeert. Dit verbetert de prestaties door onnodige vernietiging en recreatie van componenten te vermijden, wat vooral voordelig is voor toepassingen waarbij gebruikers vaak tussen weergaven wisselen.
Hoe PersistentRouteOutlet
werkt:
- Component Caching: Het houdt een in-memory cache bij van alle componenten die binnen de outlet zijn weergegeven.
- Zichtbaarheid Toggle: In plaats van componenten uit de DOM te verwijderen, verbergt het deze wanneer er weggenavigeerd wordt van een route.
- Component Herstel: Wanneer de gebruiker terugnavigeert naar een eerder gecachet route, wordt de component simpelweg opnieuw weergegeven zonder de noodzaak voor recreatie.
Dit gedrag is bijzonder nuttig voor complexe gebruikersinterfaces waar constant opnieuw weergeven van componenten de prestaties kan verslechteren. Om deze toggling van zichtbaarheid mogelijk te maken, moeten de beheerde componenten de HasVisibility
interface implementeren, waardoor de PersistentRouteOutlet
hun zichtbaarheid kan beheren.
PersistentRouteOutlet
te gebruikenGebruik PersistentRouteOutlet
wanneer het frequent creëren en vernietigen van componenten leidt tot prestatieproblemen in uw app. Het wordt over het algemeen aanbevolen om het standaardgedrag van het creëren en vernietigen van componenten tijdens route-overgangen toe te staan, omdat dit helpt om potentiële bugs en problemen met het behouden van een consistente staat te vermijden. In scenario's waar prestaties cruciaal zijn en componenten complex of kostbaar zijn om opnieuw te creëren, kan PersistentRouteOutlet
aanzienlijke verbeteringen bieden door componenten te cache en hun zichtbaarheid te beheren.
Voorbeeld van PersistentRouteOutlet
implementatie:
@Route
public class MainLayout extends Composite<AppLayout> implements RouteOutlet {
PersistentRouteOutlet outlet = new PersistentRouteOutlet(this);
public MainLayout() {
setHeader();
setDrawer();
}
@Override
public void removeRouteContent(Component component) {
outlet.removeRouteContent(component);
}
@Override
public void showRouteContent(Component component) {
outlet.showRouteContent(component);
}
}
In dit voorbeeld gebruikt MainLayout
PersistentRouteOutlet
om zijn kindroutes te beheren. Bij het navigeren tussen routes worden componenten niet uit de DOM verwijderd maar verborgen, zodat ze beschikbaar blijven voor snelle herweergave wanneer de gebruiker terugnavigeert. Deze aanpak verbetert de prestaties aanzienlijk, vooral voor weergaven met complexe inhoud of zwaar gebruik van middelen.