React路由器:防止导航到目标路由
React-router: prevent navigation to target route
我使用的是具有历史useQueries(createHashHistory)()
的react路由器,我有几个路由要根据路由的配置阻止导航到
所以路由配置是这样的:
<Route path="/" name={RouteNames.APP} component={AppContainer}>
<Route path="view-1"
onEnter={ view1onEnter }
onLeave={ view1onLeave }
component={ View1 }
canNavigate={ false }
/>
<Route path="view-2"
onEnter={ view2onEnter }
onLeave={ view2onLeave }
component={ View2 }
canNavigate={ true }
/>
...
</Route>
假设我在#/view-2
上,并调用类似history.push({pathname: '/view-1'});
的操作。但是一旦路由view-1
有了标志canNavigate={false}
,我就想阻止导航到它,并显示一条消息,而不更改哈希和任何其他副作用(比如调用view-2
的onLeave
钩子)。
我在考虑听history
:
history.listenBefore((location, callback) => {
//e.g. callback(false) to prevent navigation
})
但我无法让路由实例检查canNavigate
标志
后来我发现history
有一个方法match
,它实际上基于给定的location
:获得下一个路由器状态
history.listenBefore((location, callback) => {
history.match(location, (error, redirectLocation, nextState) => {
const route = _.last(nextState.routes);
if (route.canNavigate) {
callback();
} else {
callback(false);
}
});
})
但问题是history.match
在内部为view-2
调用onLeave
钩子(例如,即使用户停留在view-2
视图上,也可能清除状态)。
问题:是否可以在历史/路由器没有任何更改的情况下阻止从view-2
进行导航,并根据目标路线配置做出此决定?
React在调用history.push.后无法阻止导航
您应该用一个自定义的历史记录服务封装历史记录服务,该服务将检查是否可以导航,如果可以,则调用history.push。否则,将阻止导航并保留状态。
相关文章:
- Emberjs应用程序加载在除Index之外的所有路由上
- 正在使用$location.path(.)路由ng视图
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- 如何覆盖锚点元素's href目标,并在我点击转到目标javascript时删除其他错误
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- Href:当前DIV中的目标ID
- 未激发路由的控制器属性上的观察者
- AngularJS ui路由器html5模式中断路由
- 发送json对象或使用express路由呈现视图
- 当使用extern和目标JavaScript时,我如何强制Haxe编译器使用require语句
- 使用主干网和rails的静态页面路由
- 如何使用Passport保护路由终结点
- 以ECMAScript 5及更高版本为目标时,八进制文字不可用
- 有没有办法用routerLink/router.navigation附加查询/路由参数
- Nodejs和express路由,如何处理客户端的承诺
- 如何使用ember.js在操作中传递当前上下文中目标旁边的信息
- TinyMCE实例在切换角度路由选项时会消失
- React路由器:防止导航到目标路由
- 以edit结尾的目标路由