React Router Redux ConnectedRouter не обновляется с изменением маршрута

Я столкнулся с проблемой, когда ConnectedRouter не обновляет историю при изменении маршрута. При изменении маршрута хранилище получает обновленную историю, а маршрутизатор (дочерний элемент ConnectedRouter) получает обновленную историю, но история ConnectedRouter остается прежней. Приложение не отображает новый компонент, но URL браузера изменяется.

индекс

import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import { ConnectedRouter } from 'react-router-redux'
import AppContainer from './containers/app'
import { history, store } from './store'

ReactDOM.render(
  <Provider store={store}>
    <ConnectedRouter history={history}>
      <AppContainer />
    </ConnectedRouter>
  </Provider>,
  document.getElementById('root')
)

хранить

import createHistory from 'history/createBrowserHistory'
import { createStore, applyMiddleware, compose } from 'redux'
import { routerMiddleware } from 'react-router-redux'
import { rootReducer } from './reducers/root'

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose

export const history = createHistory()
const middleware = routerMiddleware(history)

export const store = createStore(
  rootReducer,
  composeEnhancers(applyMiddleware(middleware))
)

rootReducer

import { combineReducers } from 'redux'
import { routerReducer } from 'react-router-redux'

export const rootReducer = combineReducers({
  router: routerReducer,
})

HeaderContainer

import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import { withRouter } from 'react-router-dom'
import { push } from "react-router-redux"
import { HeaderTemplate } from '../components/templates/header'

const mapStateToProps = state => ({})

const mapDispatchToProps = dispatch =>
  bindActionCreators({
    pushRoute: location => dispatch(push(location)),
  }, dispatch)

export default withRouter(
  connect(mapStateToProps, mapDispatchToProps)(HeaderTemplate)
)

HeaderTemplate

import React from 'react'

export const HeaderTemplate = props => (
  <div className="content">
    <nav>
      <ul>
        <SomeLink onClick={() => props.pushRoute('/')}>Link1</SomeLink>
        <SomeLink onClick={() => props.pushRoute('/test')}>Link2</SomeLink>
      </ul>
    </nav>
  </div>
)

2 ответа

Похоже, что вы делаете, оборачивая HeaderContainer с withRouter но вы должны на самом деле обернуть AppContainer с тем, предполагая, что AppContainer имеет фактический <Route />внутри него

Кроме этого единственное, что я хотел бы сказать, это убедиться, что вы бежали:

npm install --save react-router-redux@next

для того, чтобы пользовательConnectedRouter

Вопрос немного сбивает с толку, но я думаю, что знаю вашу проблему. Я не верю, что Маршрутизатор может быть дочерним элементом ConnectedRouter, Вам необходимо ЗАМЕНИТЬ Маршрутизатор с ConnectedRouter, и все будет работать так, как ожидается.

Другие вопросы по тегам