终极版;通过combineReducers使用组合减速器时访问该州的其他部分

时间:2015-11-19 13:18:13

标签: javascript reactjs react-router redux

更新

感谢@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
})

在这种情况下,我想基于全局状态的另一部分来改变条目状态;由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
  }
}

我想到的其他一些方法;

  • 将路由器状态连接到Entries路由组件,使用componentWillMount生命周期方法检查路由器状态,并使用页面调用操作创建者,并限制值依次改变条目状态。这会奏效;但是我在安装之前使用一些转换中间件在路由组件上调用静态fetchData方法,因此获取数据,然后将调用分页操作创建器;不是理想的行为。
  • 在其他地方听路由器操作(即专用路由器redux模块),在条目存储区调用动作创建者,但我不确定这与redux-router的配合程度如何,或者我将如何访问全球商店的路由器部分。
  • 根本不这样做;只需在静态fetchData方法中查询路由器状态

其他有用信息;

有问题的实施是Universal App受react-redux-universal-hot-example

的启发

相关代表

  • 反应0.14.2
  • redux 3.0.3
  • react-router 1.0.0-rc3
  • redux-router 1.0.0-beta3

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

1 个答案:

答案 0 :(得分:8)

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

看起来行动所需的信息是什么?

<script>
    $(document).ready(function()
    { 
       $('.check').change(function()
       {
           var totalPrijs=0;
           $('.check').each(function () {
               if (this.checked) {
                   totalPrijs+=parseInt($(this).val());
               }
           });

           $("#output").text(totalPrijs); 
       });

    });   
</script>

和行动:

history.listen((error, nextRouterState) => {
 ...
 store.dispatch(routerDidChange(nextRouterState));

请尝试检查export function routerDidChange(state) { return { type: ROUTER_DID_CHANGE, payload: state }; }

但是你的switch语句使用的是action.payload而不是action,因此有一些可疑的东西......你也不需要action.type - 请参阅http://redux.js.org/docs/basics/Reducers.html