我正在使用 Vaadin Flow。我遇到一个问题,在我导航到一条路线后,如果我重新加载页面,我仍然会停留在同一页面上(我想这应该是这样工作的)。我希望在重新加载时重定向到特定路线。类似于捕获重新加载事件并重定向到特定路由。
例如。
http://localhost:9090/user - 我目前所在的当前路线。
http://localhost:9090/- 我需要在页面重新加载时导航到的路径。
提前致谢。
最佳答案
你的问题不是很清楚你只是想要
a) 别名或
b) 创建一个只显示一次的 View ,然后将用户重定向到其他地方。
对于别名,有一个使用 @RouteAlias
注释的非常简单的解决方案。这使得向 View 添加多个路由成为可能。
@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
,否则将创建新的 View 实例并且计数将始终为零。
@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++;
}
}
如果您希望将导航限制到该 View ,以便它只能通过您的应用程序而不是通过直接链接(或刷新)发生,那么您可以使用 BeforeEnterObserver
并检查NavigationTrigger
.
当直接通过 URL 导航或刷新浏览器选项卡时,它将是 PAGE_LOAD
,当使用 RouterLink
和 UI_NAVIGATE 时,它将是
使用 ROUTER_LINK
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);
}
}
}
关于routes - Vaadin Flow 在页面重新加载时重定向到特定路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67723614/