REDUX
Możesz także użyć react-router-redux
które ma goBack()
i push()
.
Oto pakiet samplerów do tego:
W punkcie wejścia aplikacji potrzebujesz ConnectedRouter
, a czasem trudnym do podłączenia jest history
obiekt. Oprogramowanie pośredniczące Redux nasłuchuje zmian w historii:
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'),
)
Pokażę ci sposób podłączenia history
. Zwróć uwagę, jak historia jest importowana do sklepu, a także eksportowana jako singleton, dzięki czemu można jej użyć w punkcie wejścia aplikacji:
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
Powyższy przykładowy blok pokazuje, jak załadować react-router-redux
pomocników oprogramowania pośredniego, które kończą proces instalacji.
Myślę, że ta następna część jest zupełnie dodatkowa, ale dołączę ją na wypadek, gdyby ktoś w przyszłości znalazł korzyści:
import { combineReducers } from 'redux'
import { routerReducer as routing } from 'react-router-redux'
export default combineReducers({
routing, form,
})
Używam routerReducer
cały czas, ponieważ pozwala mi to wymusić przeładowanie komponentów, które normalnie nie powodują shouldComponentUpdate
. Oczywistym przykładem jest pasek nawigacji, który ma się aktualizować, gdy użytkownik naciśnie NavLink
przycisk. Jeśli pójdziesz tą drogą, dowiesz się, że metoda łączenia Redux wykorzystujeshouldComponentUpdate
. Dzięki routerReducer
, możesz użyćmapStateToProps
mapować zmiany tras na pasku nawigacyjnym, co spowoduje jego aktualizację, gdy zmieni się obiekt historii.
Lubię to:
const mapStateToProps = ({ routing }) => ({ routing })
export default connect(mapStateToProps)(Nav)
Wybacz mi, dodam kilka dodatkowych słów kluczowych dla ludzi: jeśli twój komponent nie aktualizuje się prawidłowo, zbadaj shouldComponentUpdate
, usuwając funkcję connect i zobacz, czy rozwiązuje problem. Jeśli tak, pobierz, routerReducer
a komponent zaktualizuje się poprawnie po zmianie adresu URL.
Na zakończenie, po zrobieniu tego wszystkiego, możesz zadzwonić goBack()
lubpush()
dowolnym momencie!
Wypróbuj teraz w jakimś losowym komponencie:
- Importuj w
connect()
- Nie potrzebujesz nawet
mapStateToProps
lubmapDispatchToProps
- Importuj w goBack i wypychaj z
react-router-redux
- Połączenie
this.props.dispatch(goBack())
- Połączenie
this.props.dispatch(push('/sandwich'))
- Przeżyj pozytywne emocje
Jeśli potrzebujesz więcej próbek, sprawdź: https://www.npmjs.com/package/react-router-redux