Redux; доступ к другим частям штата при использовании составных редукторов с помощью combReducers
Обновление
Благодаря @Dominic Tobias и @gabdallah за то, что я заметил мою неловкую ошибку.
Правильный ответ, конечно,
попробуйте проверить action.payload
.
Другие комментарии относительно оператора switch и объекта действия мы ссылаемся на ошибки, которые я сделал в моем примере, с которых я с тех пор исправил.
Представьте, что я объединил следующие два редуктора:
import { combineReducers } from 'redux'
import { routerStateReducer } from 'redux-router'
import entries from './entries'
export default combineReducers({
router: routerStateReducer,
entries
})
Я хотел бы изменить состояние записей на основе другой части глобального состояния, в данном случае; состояние маршрутизатора, предоставляемое редукционным маршрутизатором, чтобы, например, реализовать разбиение на страницы.
Как я мог сделать что-то подобное?
// entries.js
import { ROUTER_DID_CHANGE } from 'redux-router/lib/constants'
const initialState = {}
function entries (state = initialState, action) {
switch (action.type) {
case ROUTER_DID_CHANGE:
// How can I access `state.router` here in order to do something like this;
if (routerState.location.pathname === '/entries') {
return {
...state,
page: routerState.location.query.page || state.page,
limit: routerState.location.query.limit || state.limit
}
}
return state
}
}
Некоторые другие подходы, которые приходят на ум;
- подключите состояние маршрутизатора к компоненту маршрута
Entries
, используйте метод жизненного цикла componentWillMount для проверки состояния маршрутизатора и вызовите создателя действия со страницей и значениями предела, которые изменяют состояние записей по очереди. Это сработает; однако я использую переходное промежуточное программное обеспечение для вызова статического метода fetchData
компонента маршрута перед его установкой, поэтому данные получаются, а потом создатель действия подкачки будет вызываться впоследствии; не желаемое поведение.
- Слушайте действия маршрутизатора где-то в другом месте (т.е. выделенный модуль редукции маршрутизатора), вызовите создателя действия в хранилище записей, но я не уверен, насколько это подходит для редукционного маршрутизатора или как я получаю доступ к маршрутизатору часть глобального магазина.
- не делайте этого вообще; просто запросите состояние маршрутизатора в статическом методе fetchDatali >
Другая полезная информация;
Реализация, о которой идет речь, - это приложение Universal, сильно вдохновленное реакцией-redux-universal-hot-example
Соответствующие отпечатки
- реагировать 0.14.2
- redux 3.0.3
- response-router 1.0.0-rc3
- redux-router 1.0.0-beta3
Как я могу достичь этого или подобного поведения? Я даже думаю об этом правильно?
Ответы
Ответ 1
В старые времена, прежде чем вещи стали проще для разработчиков, люди будут слушать событие popstate в объекте history;)
Похоже, что требуемая информация находится в действии?
history.listen((error, nextRouterState) => {
...
store.dispatch(routerDidChange(nextRouterState));
и действие:
export function routerDidChange(state) {
return {
type: ROUTER_DID_CHANGE,
payload: state
};
}
Итак, попробуйте проверить action.payload
.
Однако ваш оператор switch использует action
вместо action.type
, поэтому там что-то происходит. Вам не нужно делать action = {}
либо - см. http://redux.js.org/docs/basics/Reducers.html