你的问题不是很清楚你是否只是想要
a) 别名或
b) 创建一个只显示一次的视图,然后将用户重定向到其他位置。
对于别名,有一个使用@RouteAlias 注释的非常简单的解决方案。这使得向视图中添加多条路线成为可能。
@Route(value = "", layout = MainLayout.class)
@RouteAlias(value = "main", layout = MainLayout.class)
public class MainView extends VerticalLayout {
...
}
对于第二种情况,我将研究BeforeEnterEvent,它在导航期间触发并有助于重定向(请参阅:https://vaadin.com/docs/v14/flow/routing/tutorial-routing-lifecycle)。您还需要@PreserveOnRefresh,否则将创建新的视图实例并且计数将始终为零。
@PreserveOnRefresh
@Route(value = "", layout = MainLayout.class)
public class MainView extends VerticalLayout implements BeforeEnterObserver {
private int count = 0;
@Override
public void beforeEnter(BeforeEnterEvent event) {
if (count > 0) {
event.forwardTo(OtherView.class);
}
count++;
}
}
如果您希望将导航限制到该视图,以便它只能通过您的应用程序而不是通过直接链接(或刷新)发生,那么您可以使用BeforeEnterObserver 并检查NavigationTrigger 来完成此操作。
直接通过 URL 导航或刷新浏览器选项卡时为PAGE_LOAD,使用RouterLink 时为ROUTER_LINK,使用UI#navigate 时为UI_NAVIGATE。
请注意,即使您尚未创建路由器链接,用户也可以在浏览器中创建路由器链接,因此您不应依赖它来确保安全。
@Route
public class ExampleView extends VerticalLayout implements BeforeEnterObserver {
public ExampleView() {
add("Hello");
}
@Override
public void beforeEnter(BeforeEnterEvent beforeEnterEvent) {
if (beforeEnterEvent.getTrigger() == NavigationTrigger.PAGE_LOAD) {
beforeEnterEvent.rerouteTo(MainView.class);
}
}
}