Подтвердить что ты не робот

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 компонента маршрута перед его установкой, поэтому данные получаются, а потом создатель действия подкачки будет вызываться впоследствии; не желаемое поведение.
  • Слушайте действия маршрутизатора где-то в другом месте (т.е. выделенный модуль редукции маршрутизатора), вызовите создателя действия в хранилище записей, но я не уверен, насколько это подходит для редукционного маршрутизатора или как я получаю доступ к маршрутизатору часть глобального магазина.
  • не делайте этого вообще; просто запросите состояние маршрутизатора в статическом методе fetchData​​li >

Другая полезная информация;

Реализация, о которой идет речь, - это приложение Universal, сильно вдохновленное реакцией-redux-universal-hot-example

Соответствующие отпечатки

  • реагировать 0.14.2
  • redux 3.0.3
  • response-router 1.0.0-rc3
  • redux-router 1.0.0-beta3

Как я могу достичь этого или подобного поведения? Я даже думаю об этом правильно?

4b9b3361

Ответ 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