Route Navigation
En webforJ, navegar entre rutas es el mecanismo central para cambiar vistas y componentes según las acciones del usuario o los cambios en la URL. La navegación permite a los usuarios moverse sin problemas entre diferentes partes de la aplicación sin refrescar la página. Esta navegación del lado del cliente mantiene la aplicación receptiva y fluida, preservando el estado de la aplicación.
Navegación programática
Puedes desencadenar la navegación desde cualquier parte de tu aplicación utilizando la clase Router
. Esto permite cambios dinámicos en los componentes mostrados basados en eventos como clics en botones u otras interacciones del usuario.
Aquí tienes un ejemplo de cómo navegar a una ruta específica:
@Route(value = "dashboard")
public class DashboardView extends Composite<Div> {
// Lógica del componente aquí
}
// navegar a la vista
Router.getCurrent().navigate(DashboardView.class);
En este ejemplo, navegar al componente DashboardView
programáticamente provoca que el componente DashboardView
se renderice y que la URL del navegador se actualice a /dashboard
.
También es posible navegar a la vista pasando una nueva Location
Router.getCurrent().navigate(new Location("/dashboard"));
Al navegar entre vistas, los desarrolladores tienen dos opciones: pueden pasar la clase de vista o de ruta, lo que permite al enrutador generar automáticamente la URL y renderizar la vista, o pasar la ubicación directamente. Ambos métodos son válidos, pero usar la clase de vista es el enfoque preferido porque ofrece mejor flexibilidad para futuros cambios. Por ejemplo, si decides actualizar la ruta más adelante, solo necesitas modificar la anotación @Route
, sin tener que cambiar ningún código que utilice la clase de vista para la navegación.
Navegación con parámetros
Cuando necesitas pasar parámetros junto con la ruta, webforJ te permite incrustar parámetros en la URL. Aquí tienes cómo puedes navegar a una ruta con parámetros:
@Route("user/:id")
public class UserProfileView extends Composite<Div> implements DidEnterObserver {
H1 title = new H1();
public UserProfileView() {
getBoundComponent().add(title);
}
public void setTile(String title) {
this.title.setText(title);
}
public String getTitle() {
return title.getText();
}
@Override
public void onDidEnter(DidEnterEvent event, ParametersBag parameters) {
String id = parameters.getAlpha("id").orElse("Desconocido");
setTile(id);
}
}
// navegar a la vista y pasar el id del usuario
Router.getCurrent().navigate(
UserProfileView.class,
ParametersBag.of("id=JohnDoe")
);
Esto navega a /user/JohnDoe
, donde JohnDoe
podría representar un ID de usuario. El componente para esta ruta puede extraer el parámetro y usarlo en consecuencia.
Instancia de vista creada
El método navigate
acepta un Consumer
de Java que se invoca una vez que la navegación se completa. El Consumer
recibe la instancia del componente de vista creado, envuelto en un Optional
de Java, lo que permite al desarrollador interactuar con la vista después de una navegación exitosa.
Router.getCurrent().navigate(
UserProfileView.class,
ParametersBag.of("id=JohnDoe"), (component) -> {
component.ifPresent(view -> {
console().log("El nuevo título es: " + view.getTitle());
});
});
El consumidor recibe un Optional
de Java para el componente porque podría ser null
, o no estar creado por varias razones. Por ejemplo, el componente puede no renderizarse si los observadores de navegación vetan la navegación y detienen el proceso.
Opciones de navegación
La clase NavigationOptions
permite a los desarrolladores ajustar cómo se maneja la navegación dentro de la aplicación. Al establecer opciones específicas, puedes controlar el comportamiento de la navegación, como si se debe actualizar el historial del navegador, invocar observadores del ciclo de vida o incluso disparar eventos de navegación.
NavigationOptions options = new NavigationOptions();
options.setUpdateHistory(false);
Router.getCurrent().navigate(
new Location("user/JohnDoe"), options);
Establecimiento de opciones de navegación
La clase NavigationOptions
proporciona varios métodos para personalizar el comportamiento de navegación. Estos incluyen controlar cómo se manejan las rutas, si se notifica a los observadores y cómo se actualiza el historial del navegador.
Aquí están las principales opciones de configuración disponibles dentro de NavigationOptions
:
-
Tipo de Navegación (
setNavigationType
)
Esta opción define si la nueva ruta debe ser agregada al historial del navegador o reemplazar la ruta actual.PUSH
: Agrega la nueva ruta a la pila de historial, preservando la ubicación actual.REPLACE
: Reemplaza la ruta actual en la pila de historial con la nueva ubicación, impidiendo que el botón de atrás navegue a la ruta anterior.
-
Disparar Eventos (
setFireEvents
)
Determina si los eventos del ciclo de vida de navegación deben ser disparados durante la navegación. Por defecto, esto se establece entrue
, y los eventos se disparan. Si se establece enfalse
, no se dispararán eventos, lo que es útil para una navegación silenciosa. -
Invocar Observadores (
setInvokeObservers
)
Esta bandera controla si la navegación debe activar observadores dentro de los componentes navegados. Los observadores normalmente manejan eventos como la entrada o salida de rutas. Establecer esto enfalse
previene que los observadores sean invocados. -
Actualizar Historial (
setUpdateHistory
)
Cuando se establece enfalse
, esta opción impide que la ubicación del historial se actualice. Esto es útil cuando deseas cambiar la vista sin afectar la navegación hacia atrás o hacia adelante del navegador. Solo afecta la gestión del historial, no el ciclo de vida del componente ni el manejo de rutas. -
Objeto de Estado (
setState
)
El objeto de estado permite pasar información adicional al actualizar el historial del navegador. Este objeto se almacena en el estado del historial del navegador y puede ser utilizado posteriormente para propósitos personalizados, como guardar el estado de la aplicación durante la navegación.
Generando ubicaciones para vistas
El enrutador puede generar la ubicación para vistas basado en el patrón de ruta definido en la vista. También puedes proporcionar parámetros adicionales para segmentos dinámicos y requeridos en la URL. Esto puede ser útil al construir enlaces o compartir puntos de acceso directos a vistas específicas en la aplicación.
Aquí tienes cómo generar una Location
basada en una clase de vista y parámetros de ruta:
Class<UserProfileView> userProfileView = UserProfileView.class;
ParametersBag params = ParametersBag.of("id=JohnDoe");
Optional<Location> location = Router.getCurrent().getLocation(userProfileView, params);
console().log(location.get());
Esto genera un objeto Location
con la ruta /user/JohnDoe
, la URI completa como una cadena.