Vaadin Flow 在页面重新加载时重定向到特定路由
Vaadin Flow Redirect to Specific Route on Page Reload
我正在使用 Vaadin Flow。我遇到一个问题,在我导航到一条路线后,如果我重新加载页面,我仍然会停留在同一页面上(我想这应该是这样工作的)。我希望在重新加载时重定向到特定路线。比如捕获重新加载事件并重定向到特定路由。
例如
http://localhost:9090/user - 我现在所在的路由
http://localhost:9090/ - 我需要在页面重新加载时导航到的路径。
提前致谢。
你的问题不是很清楚你只是想
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++;
}
}
如果您希望将导航限制到该视图,以便它只能通过您的应用程序发生,而不是通过直接 link(或刷新),那么您可以使用 BeforeEnterObserver
并检查 NavigationTrigger
.
当直接通过URL导航或刷新浏览器选项卡时它将是PAGE_LOAD
,当使用RouterLink
时将是ROUTER_LINK
,当使用UI_NAVIGATE
时将是UI_NAVIGATE
UI#navigate
.
请注意,即使您尚未创建路由器,用户也可以在浏览器中创建路由器 link,因此您不应依赖它来确保安全。
@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);
}
}
}
我正在使用 Vaadin Flow。我遇到一个问题,在我导航到一条路线后,如果我重新加载页面,我仍然会停留在同一页面上(我想这应该是这样工作的)。我希望在重新加载时重定向到特定路线。比如捕获重新加载事件并重定向到特定路由。
例如
http://localhost:9090/user - 我现在所在的路由
http://localhost:9090/ - 我需要在页面重新加载时导航到的路径。
提前致谢。
你的问题不是很清楚你只是想
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++;
}
}
如果您希望将导航限制到该视图,以便它只能通过您的应用程序发生,而不是通过直接 link(或刷新),那么您可以使用 BeforeEnterObserver
并检查 NavigationTrigger
.
当直接通过URL导航或刷新浏览器选项卡时它将是PAGE_LOAD
,当使用RouterLink
时将是ROUTER_LINK
,当使用UI_NAVIGATE
时将是UI_NAVIGATE
UI#navigate
.
请注意,即使您尚未创建路由器,用户也可以在浏览器中创建路由器 link,因此您不应依赖它来确保安全。
@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);
}
}
}