REDUX
Możesz także użyć react-router-reduxktó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 historyobiekt. 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-reduxpomocnikó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 routerReducercał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 NavLinkprzycisk. 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, routerReducera 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
mapStateToPropslubmapDispatchToProps
- 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