为什么 <Link> 和 <Redirect> 不触发 connected-react-router 中 state.router 的更新?

Why do <Link> and <Redirect> not trigger updates of state.router in connected-react-router?

在查看了将 redux 与 react-router 相结合的各种包之后,connected-react-router 似乎是最受欢迎的积极支持选择。

我的配置与 docs 中的几乎完全相同,但有一个例外如下所述。

我遇到的问题是 react-router <Redirect> 会重定向,但不会更新 state.router.location。 Codesandbox MNWE 是原始 codesandbox 的 here. [Edit: I realized just after posting that <Link> is having exactly the same problem, and illustrated it in a slight modification。抱歉,如果我刚开始的话会更清楚,但我需要睡觉!]

在下面的例子中,有3条路线。第一个匹配根“/”。第二个匹配简单的 URL,如“/anything”,默认匹配“/anything/else”。 <Where> 是一个小组件,显示其 text 属性,然后显示 state.router.location.pathname.

 <Switch>
    <Route exact path="/">
        <Where text="Root" />
    </Route>
    <Route exact path="/:thing">
        <Where text="Exact" />
    </Route>
    <Route>
    <Redirect to="/" />
    </Route>
</Switch>

当您到达时,您会看到 "Root: /",这是您应该看到的。如果在地址栏中添加“/anything”,您会看到 "Exact: /anything"。如果您在地址栏中输入“/anything/else”,地址栏将被重定向回根目录,并且 <Switch> 返回匹配根目录,但您没有看到 "Root: /"参见 "Root: /anything/else"。记录器确认,尽管手动输入的 URL 会触发 state 更新,但 <Redirect> 不会。

也许我认为它应该是错误的,但我没有看到它以某种方式记录下来。我想我犯了一些配置错误?

[我描述的配置异常是我没有在我的应用程序中使用 combineReducers,我有一个称为 appRootReducer 的减速器(在本例中为空)。所以我写了一点 createRootReducer 包装器。它工作得很好,state.router 的基本更新确实通过了。]

希望对您有所帮助!

确认!在 Github 存储库中搜索已关闭的问题,我发现我在 <BrowswerRouter> 标签中留下了。

  • Wrap your react-router v4/v5 routing with ConnectedRouter and pass the history object as a prop. Remember to delete any usage of BrowserRouter or NativeRouter as leaving this in will cause problems synchronising the state.