React Router道具`location` /`match`不会用ConnectedRouter`更新

时间:2018-08-17 22:52:11

标签: react-router react-redux react-router-dom connected-react-router

我已经按照文档中的步骤设置了应用程序:

步骤1

...
import { createBrowserHistory } from 'history'
import { applyMiddleware, compose, createStore } from 'redux'
import { connectRouter, routerMiddleware } from 'connected-react-router'
...
const history = createBrowserHistory()

const store = createStore(
  connectRouter(history)(rootReducer), // new root reducer with router state
  initialState,
  compose(
    applyMiddleware(
      routerMiddleware(history), // for dispatching history actions
      // ... other middlewares ...
    ),
  ),
)

步骤2

...
import { Provider } from 'react-redux'
import { Route, Switch } from 'react-router' // react-router v4
import { ConnectedRouter } from 'connected-react-router'
...
ReactDOM.render(
  <Provider store={store}>
    <ConnectedRouter history={history}> { /* place ConnectedRouter under Provider */ }
      <div> { /* your usual react-router v4 routing */ }
        <Switch>
          <Route exact path="/" render={() => (<div>Match</div>)} />
          <Route render={() => (<div>Miss</div>)} />
        </Switch>
      </div>
    </ConnectedRouter>
  </Provider>,
  document.getElementById('react-root')
)

我点击了Link甚至是dispatch(push('/new-url/withparam'))

然而,match location的道具仍保留先前的值或第一页的内容。

发生了什么事?

2 个答案:

答案 0 :(得分:4)

这个人咬了我很多次。

您的SwitchRoute等。必须不要位于连接的组件内!

如果已连接组件,则matchlocation等道具似乎没有更新并向下传播到您的路线。

这意味着不要连接顶级AppRootConnectedRouterRoute之间的任何其他嵌套容器

答案 1 :(得分:0)

我决定在此处添加示例,因为我认为这是有价值的输入 - 即使如此,它已经得到了回答。

我遇到了类似的问题,当我将 url 推送到路由器历史记录时,它更改了 URL,但它没有在我想要的组件上正确导航。我用谷歌搜索并搜索了几个小时的答案,直到我找到了这个线程,它最终帮助我找出了我做错了什么。所以所有功劳都归功于@ilovett。

这里有一个例子,如果有人需要它来更好地理解:

我有类似的代码:

export const routes =
    <Layout>
        <Switch>
            <Route exact path='/' component={ Component1 } />
            <Route path='/parameter1/:parameterValue' component={ Component2 } />
        </Switch>
    </Layout>;

<Provider store={ store }>
    <ConnectedRouter history={ history } children={ routes } />
</Provider>

当我进入一个项目时它工作正常,但后来我决定重构 Layout 组件并将其连接到商店,这导致 Component2 停止接收正确的ownProps.match.params.parameter1 中的值,因此它使组件完全错误。

因此,您唯一需要做的就是将 Layout 移到 ConnectedRouter 之外。 ConnectedRouterRoute 之间的任何东西都不能连接到商店。

工作示例是这样的:

export const routes =
        <Switch>
            <Route exact path='/' component={ Component1 } />
            <Route path='/parameter1/:parameterValue' component={ Component2 } />
        </Switch>;

<Provider store={ store }>
    <Layout>
        <ConnectedRouter history={ history } children={ routes } />
    </Layout>
</Provider>