A Redux binding for React Router v4
✨ Synchronize router state with redux store through uni-directional flow (i.e. history -> store -> router -> components).
🎁 Support React Router v4.
☀️ Support functional component hot reloading while preserving state (with react-hot-reload).
🎉 Dispatching of history methods (push, replace, go, goBack, goForward) works for both redux-thunk and redux-saga.
⛄ Nested children can access routing state such as the current location directly with react-redux's connect.
🕘 Support time traveling in Redux DevTools.
💎 Support Immutable.js
💪 Support TypeScript
Using npm:
$ npm install --save connected-react-router
Or yarn:
$ yarn add connected-react-router
- Create a 
historyobject. - Wrap the root reducer with 
connectRouterand supply thehistoryobject to get a new root reducer. - Use 
routerMiddleware(history)if you want to dispatch history actions (e.g. to change URL withpush('/path/to/somewhere')). 
...
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 ...
    ),
  ),
)- Wrap your react-router v4 routing with 
ConnectedRouterand pass thehistoryobject as a prop. - Place 
ConnectedRouteras a child ofreact-redux'sProvider. 
...
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')
)Now, it's ready to work!
See the examples folder
- How to navigate with Redux action
 - How to get the current browser location (URL)
 - How to set Router props e.g. basename, initialEntries, etc.
 - How to hot reload functional components
 - How to hot reload reducers
 - How to support Immutable.js
 - How to implement server-side rendering (sample codebase)
 
npm run buildGenerated files will be in the lib folder.
See Contributors and Acknowledge.