React-router:防止导航到目标路线

Posted

技术标签:

【中文标题】React-router:防止导航到目标路线【英文标题】:React-router: prevent navigation to target route 【发布时间】:2016-07-30 15:02:49 【问题描述】:

我正在使用带有历史记录 useQueries(createHashHistory)() 的 react-router,并且我有几条路线我想根据路线的配置阻止导航到。 所以路由配置是这样的:

<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 - 我想阻止导航到它并显示一条消息而不更改哈希和任何其他副作用(比如调用 onLeave 钩子view-2)。

我在考虑听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 在内部调用onLeave 钩子以获取view-2(例如,即使用户停留在view-2 视图上,也可能清除状态)。

问题:是否有可能阻止从view-2 导航而不对历史/路由器进行任何更改并根据目标路由配置做出此决定?

【问题讨论】:

【参考方案1】:

调用 history.push 后,React 无法阻止导航。

您应该使用自定义的历史服务封装历史服务,该服务将检查是否可以导航,如果可以,则调用 history.push。否则阻止导航并保持状态。

【讨论】:

嗯,实际上是can。问题是我有很多路线,想摆脱检查重复。 通过重复,你的意思是你不想检查状态是否可以导航,因为每条路线已经有一个 canNavigate 道具?另一件事,canNavigate 道具是动态的还是静态的? @JohnWilliamDomingo, canNavigate 可以是任何东西。在我的特殊情况下 - 它是一个静态属性。是的,关于重复,你是对的。

以上是关于React-router:防止导航到目标路线的主要内容,如果未能解决你的问题,请参考以下文章

在 react-router 中路由嵌套 url

React-Router 4默认路由内容显示在所有其他组件上[重复]

使用 React-Router 维护 WebSocket 连接

React-Router V6 显示上一个路由

react-router 不维护查询参数,调用 onEnter 两次

react-router v4 - browserHistory 未定义