REDUX
Puoi anche usare react-router-redux
che ha goBack()
e push()
.
Ecco un pacchetto di campionamento per questo:
Nel punto di ingresso della tua app, hai bisogno ConnectedRouter
e una connessione a volte complicata da collegare è l' history
oggetto. Il middleware Redux ascolta le modifiche alla cronologia:
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'),
)
Ti mostrerò un modo per collegare il file history
. Nota come la cronologia viene importata nello store ed esportata anche come singleton in modo che possa essere utilizzata nel punto di ingresso dell'app:
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
Il blocco di esempio sopra mostra come caricare gli react-router-redux
helper middleware che completano il processo di configurazione.
Penso che questa parte successiva sia completamente extra, ma la includerò nel caso in cui qualcuno in futuro ne tragga vantaggio:
import { combineReducers } from 'redux'
import { routerReducer as routing } from 'react-router-redux'
export default combineReducers({
routing, form,
})
Lo uso routerReducer
sempre perché mi permette di forzare il ricaricamento di componenti che normalmente non sono dovuti a shouldComponentUpdate
. L'esempio ovvio è quando si dispone di una barra di navigazione che dovrebbe aggiornarsi quando un utente preme un NavLink
pulsante. Se segui questa strada, imparerai che utilizza il metodo di connessione di Redux shouldComponentUpdate
. Con routerReducer
, puoi usare mapStateToProps
per mappare le modifiche al percorso nella barra di navigazione e questo attiverà l'aggiornamento quando l'oggetto della cronologia cambia.
Come questo:
const mapStateToProps = ({ routing }) => ({ routing })
export default connect(mapStateToProps)(Nav)
Perdonami mentre aggiungo alcune parole chiave extra per le persone: se il tuo componente non si aggiorna correttamente, indagare shouldComponentUpdate
rimuovendo la funzione di connessione e vedere se risolve il problema. In tal caso, inserire il routerReducer
e il componente si aggiornerà correttamente quando l'URL cambia.
In conclusione, dopo aver fatto tutto ciò, puoi chiamare goBack()
o push()
ogni volta che vuoi!
Provalo ora in qualche componente casuale:
- Importa in
connect()
- Non hai nemmeno bisogno di
mapStateToProps
omapDispatchToProps
- Importa in goBack e invia da
react-router-redux
- Chiamata
this.props.dispatch(goBack())
- Chiamata
this.props.dispatch(push('/sandwich'))
- Prova un'emozione positiva
Se hai bisogno di più campioni, controlla: https://www.npmjs.com/package/react-router-redux