RESTAURADO
Você também pode usar o react-router-redux
que tem goBack()
e push()
.
Aqui está um pacote de amostra para isso:
No ponto de entrada do seu aplicativo, você precisa ConnectedRouter
, e uma conexão às vezes difícil de conectar é o history
objeto. O middleware Redux escuta as mudanças do histórico:
import React from 'react'
import { render } from 'react-dom'
import { ApolloProvider } from 'react-apollo'
import { Provider } from 'react-redux'
import { ConnectedRouter } from 'react-router-redux'
import client from './components/apolloClient'
import store, { history } from './store'
import Routes from './Routes'
import './index.css'
render(
<ApolloProvider client={client}>
<Provider store={store}>
<ConnectedRouter history={history}>
<Routes />
</ConnectedRouter>
</Provider>
</ApolloProvider>,
document.getElementById('root'),
)
Vou mostrar a você uma maneira de conectar o history
. Observe como o histórico é importado para a loja e também exportado como um singleton para que possa ser usado no ponto de entrada do aplicativo:
import { createStore, applyMiddleware, compose } from 'redux'
import { routerMiddleware } from 'react-router-redux'
import thunk from 'redux-thunk'
import createHistory from 'history/createBrowserHistory'
import rootReducer from './reducers'
export const history = createHistory()
const initialState = {}
const enhancers = []
const middleware = [thunk, routerMiddleware(history)]
if (process.env.NODE_ENV === 'development') {
const { devToolsExtension } = window
if (typeof devToolsExtension === 'function') {
enhancers.push(devToolsExtension())
}
}
const composedEnhancers = compose(applyMiddleware(...middleware), ...enhancers)
const store = createStore(rootReducer, initialState, composedEnhancers)
export default store
O bloco de exemplo acima mostra como carregar os react-router-redux
ajudantes de middleware que completam o processo de configuração.
Acho que a próxima parte é completamente extra, mas vou incluí-la para o caso de alguém no futuro encontrar algum benefício:
import { combineReducers } from 'redux'
import { routerReducer as routing } from 'react-router-redux'
export default combineReducers({
routing, form,
})
Eu uso routerReducer
o tempo todo porque me permite forçar a recarga de componentes que normalmente não fazem shouldComponentUpdate
. O exemplo óbvio é quando você tem uma barra de navegação que deve ser atualizada quando um usuário pressiona um NavLink
botão. Se você seguir esse caminho, aprenderá que o método de conexão do Redux usa shouldComponentUpdate
. Com o routerReducer
, você pode usar mapStateToProps
para mapear alterações de roteamento na barra de navegação, e isso irá acioná-la para atualizar quando o objeto de histórico for alterado.
Como isso:
const mapStateToProps = ({ routing }) => ({ routing })
export default connect(mapStateToProps)(Nav)
Perdoe-me enquanto adiciono algumas palavras-chave extras para as pessoas: se o seu componente não está sendo atualizado corretamente, investigue shouldComponentUpdate
removendo a função de conexão e veja se ela corrige o problema. Nesse caso, extraia o routerReducer
e o componente será atualizado corretamente quando o URL mudar.
Para encerrar, depois de fazer tudo isso, você pode ligar goBack()
ou push()
quando quiser!
Experimente agora em algum componente aleatório:
- Importar em
connect()
- Você nem precisa
mapStateToProps
oumapDispatchToProps
- Importar em goBack e enviar de
react-router-redux
- Ligar
this.props.dispatch(goBack())
- Ligar
this.props.dispatch(push('/sandwich'))
- Experimente emoção positiva
Se precisar de mais amostras, verifique: https://www.npmjs.com/package/react-router-redux