REDUX
También puede usar react-router-redux
which has goBack()
y push()
.
Aquí hay un paquete de muestra para eso:
En el punto de entrada de su aplicación, lo necesita ConnectedRouter
, y el history
objeto es una conexión a veces difícil de conectar . El middleware de Redux escucha los cambios del historial:
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'),
)
Te mostraré una forma de conectar el history
. Observe cómo el historial se importa a la tienda y también se exporta como singleton para que pueda usarse en el punto de entrada de la aplicación:
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
El bloque de ejemplo anterior muestra cómo cargar los react-router-redux
ayudantes de middleware que completan el proceso de configuración.
Creo que la siguiente parte es completamente adicional, pero la incluiré en caso de que alguien en el futuro se beneficie:
import { combineReducers } from 'redux'
import { routerReducer as routing } from 'react-router-redux'
export default combineReducers({
routing, form,
})
Utilizo routerReducer
todo el tiempo porque me permite forzar la recarga de componentes que normalmente no lo hacen debido a shouldComponentUpdate
. El ejemplo obvio es cuando tiene una barra de navegación que se supone que se actualiza cuando un usuario presiona un NavLink
botón. Si sigue ese camino, aprenderá que usa el método de conexión de Redux shouldComponentUpdate
. Con routerReducer
, puede utilizar mapStateToProps
para mapear cambios de ruta en la barra de navegación, y esto hará que se actualice cuando cambie el objeto del historial.
Me gusta esto:
const mapStateToProps = ({ routing }) => ({ routing })
export default connect(mapStateToProps)(Nav)
Perdóneme mientras agrego algunas palabras clave adicionales para las personas: si su componente no se actualiza correctamente, investigue shouldComponentUpdate
eliminando la función de conexión y vea si soluciona el problema. Si es así, ingrese routerReducer
y el componente se actualizará correctamente cuando cambie la URL.
Para terminar, después de hacer todo eso, ¡puedes llamar goBack()
o push()
cuando quieras!
Pruébelo ahora en algún componente aleatorio:
- Importar en
connect()
- Ni siquiera necesitas
mapStateToProps
omapDispatchToProps
- Importar en goBack y empujar desde
react-router-redux
- Llamada
this.props.dispatch(goBack())
- Llamada
this.props.dispatch(push('/sandwich'))
- Experimente la emoción positiva
Si necesita más muestras, consulte: https://www.npmjs.com/package/react-router-redux