终极版;通过 combineReducers 使用组合化简器时访问状态的其他部分

Redux; accessing other parts of the state when using composed reducers via combineReducers

更新

感谢@Dominic Tobias 和@gabdallah 发现了我令人尴尬的错误。

正确答案当然是;

so try checking action.payload.

关于 switch 语句和操作对象的其他评论,我们指的是我在示例中犯的错误,我已经更正了这些错误。


假设我组合了以下两个减速器;

import { combineReducers } from 'redux'
import { routerStateReducer } from 'redux-router'
import entries from './entries'

export default combineReducers({
  router: routerStateReducer,
  entries
})

在这种情况下,我想根据全局状态的另一部分改变条目状态; redux-router 提供的路由器状态,例如为了实现分页。

我怎么能做这样的事情?

// 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
  }
}

想到的其他一些方法;

其他有用的信息;

有问题的实现是受 react-redux-universal-hot-example 启发很大的 Universal App

相关部门

我怎样才能实现这种或类似的行为?我是否以正确的方式思考这个问题?

过去,在事情变得简单之前,开发人员会在历史对象上监听 popstate 事件;)

看起来要求的信息是关于操作的?

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