首页 > 解决方案 > 如何在“全局”减速器中使用“主”状态?

问题描述

我有一个 react、redux-saga、不可变的 js 应用程序。

有了这个架构,我的 redux store 就是这样的。

global: {
   notifications:{...}
   ...
},
home: {
   ...contents
}

问题是当我想更新时,home contents我使用的是附在家里的减速器。但是家用减速机里面,notifications是不可用的。因为notifications是里面global

与这种方法相反的是使用globalreducer,通知在全局状态下可用。但是这次我无法访问home > contents

我的代码如下。

这是附加到全局的减速器:

case CONTENT_ADD_SUCCESS:
  return state
    .set('loading', false)
    .update('notifications', arr => arr.push(
      fromJS(
      {
        show: true,
        type: 'success',
        message: action.response.message,
      }
    )
   .setIn(['home', 'contents'], action.response.newContent)
  ))

全局减速器注入

const withReducer = injectReducer({ key: 'global', reducer });
const withSaga = injectSaga({ key: 'global', saga });

export default compose(
  withReducer,
  withSaga,
  withConnect,
)(withStyles(mainLayoutStyle)(MainLayout));

如何使用不同的减速器状态?对于此示例,我想访问全局通知并更新主页内容。

标签: reactjsreduxreact-reduxredux-sagaimmutable.js

解决方案


我不知道我可以对不同的减速器使用相同的常数。

基本上我将另一个减速器,一个家用减速器连接到同一个常数。

下面是我的代码:这是用于layout reducer.管理通知CONTENT_ADD_SUCCESS

case CONTENT_ADD_SUCCESS:
        return state
            .set('loading', false)
            .update('notifications', arr => arr.push(
                fromJS(
                    {
                        key: CONTENT_ADD_SUCCESS_N_ID,
                        show: true,
                        type: 'success',
                        message: action.response.message,
                    }
                )
            ))

这用于home reducer管理家庭内容CONTENT_ADD_SUCCESS

case CONTENT_ADD_SUCCESS:
        console.log('HOME REDUCER :: CONTENT_ADD_SUCCESS', state);
        return state
          .update('contents', arr => arr.unshift(fromJS(JSON.parse(action.response.newContent))))

推荐阅读