REDUX
Вы также можете использовать, у react-router-redux
которого есть goBack()
и push()
.
Вот набор сэмплеров для этого:
В точке входа вашего приложения вам нужно ConnectedRouter
, и иногда сложное соединение для подключения - это history
объект. По промежуточного слоя Redux отслеживает изменения в истории:
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'),
)
Я покажу вам способ подключить history
. Обратите внимание, как история импортируется в магазин, а также экспортируется как синглтон, чтобы ее можно было использовать в точке входа приложения:
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
В приведенном выше примере блока показано, как загрузить react-router-redux
вспомогательные программы промежуточного слоя, которые завершают процесс установки.
Я думаю, что следующая часть совершенно лишняя, но я включу ее на всякий случай, если кто-то в будущем найдет пользу:
import { combineReducers } from 'redux'
import { routerReducer as routing } from 'react-router-redux'
export default combineReducers({
routing, form,
})
Я использую routerReducer
все время, потому что это позволяет мне принудительно перезагружать компоненты, которые обычно не выполняются из-за shouldComponentUpdate
. Очевидный пример - когда у вас есть панель навигации, которая должна обновляться, когда пользователь нажимает NavLink
кнопку. Если вы пойдете по этому пути, вы узнаете, что метод подключения Redux использует shouldComponentUpdate
. С помощью routerReducer
, вы можете использовать mapStateToProps
для отображения изменений маршрутизации в панели навигации, и это приведет к ее обновлению при изменении объекта истории.
Как это:
const mapStateToProps = ({ routing }) => ({ routing })
export default connect(mapStateToProps)(Nav)
Простите меня, но я добавляю несколько дополнительных ключевых слов для людей: если ваш компонент не обновляется должным образом, исследуйте shouldComponentUpdate
, удалив функцию подключения, и посмотрите, решит ли она проблему. Если это так, потяните за, routerReducer
и компонент обновится должным образом при изменении URL-адреса.
В заключение, после всего этого вы можете позвонить goBack()
или в push()
любое время!
Попробуйте сейчас в каком-нибудь случайном компоненте:
- Импортировать в
connect()
- Вам даже не нужно
mapStateToProps
илиmapDispatchToProps
- Импортировать в GoBack и нажать из
react-router-redux
- Вызов
this.props.dispatch(goBack())
- Вызов
this.props.dispatch(push('/sandwich'))
- Испытайте положительные эмоции
Если вам нужна дополнительная выборка, посетите: https://www.npmjs.com/package/react-router-redux