Route Navigation
在 webforJ 中,通过路由导航是根据用户操作或 URL 更改切换视图和组件的核心机制。导航允许用户在应用的不同部分之间无缝移动,而无需刷新页面。此客户端导航使应用保持响应迅速和平滑,同时保持应用的状态。
编程导航
您可以通过使用 Router 类在应用的任何地方触发导航。这允许根据按钮点击或其他用户交互等事件动态更改显示的组件。
以下是如何导航到特定路由的示例:
@Route(value = "dashboard")
public class DashboardView extends Composite<Div> {
// 组件逻辑在此
}
// 导航 到视图
Router.getCurrent().navigate(DashboardView.class);
在此示例中,以编程方式导航到 DashboardView 组件将导致 DashboardView 组件被渲染,并且浏览器的 URL 更新为 /dashboard。
也可以通过传递新的 Location 来导航到视图。
Router.getCurrent().navigate(new Location("/dashboard"));
类与位置:视图路由的方法
导航于视图之间时,开发人员有两种选择:可以选择传递视图或路由类,允许路由器自动生成 URL 并渲染视图,或者直接传递位置。这两种方法都是有效的,但使用视图类是首选方法,因为它提供了更好的未来变更灵活性。例如,如果您稍后决定更新路由,只需修改 @Route 注解,而无需更改使用视图类进行导航的任何代码。
带参数的导航
当您需要通过路由传递参数时,webforJ 允许您在 URL 中嵌入参数。以下是如何带参数导航至路由的示例:
@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("未知");
setTile(id);
}
}
// 导航到视图并传递用户 ID
Router.getCurrent().navigate(
UserProfileView.class,
ParametersBag.of("id=JohnDoe")
);
这将导航到 /user/JohnDoe,其中 JohnDoe 可能代表一个用户 ID。此路由的组件随后可以提取参数并相应使用。
创建视图实例
navigate 方法接受一个 Java Consumer,在导航完成后被调用。Consumer 接收一个创建的视图组件实例,包装在 java Optional 中,允许开发人员在成功导航后与视图进行交互。
Router.getCurrent().navigate(
UserProfileView.class,
ParametersBag.of("id=JohnDoe"), (component) -> {
component.ifPresent(view -> {
console().log("新的标题是: " + view.getTitle());
});
});
空实例
消费者收到一个 Java Optional 的组件,因为它可能是 null,或由于各种原因未创建。例如,如果导航观察者否决了导航并停止了该过程,则组件可能不会被渲染。