0

我收到以下错误:substate is undefined。但是,我不确定为什么substate在我的选择器中未定义。有人可以帮我弄清楚可能出了什么问题吗?

选择器:

import { createSelector } from 'reselect';

/**
 * Direct selector to the organization state domain
 */
const selectOrganizationDomain = () => (state) => state.get('organization');

/**
 * Other specific selectors
 */


/**
 * Default selector used by organization
 */

const selectOrganization = () => createSelector(
  selectOrganizationDomain(),
  (substate) => substate.toJS()
);

const selectChanges = () => createSelector(
  selectOrganization(),
  (substate) => substate.get('changes')
)

export default selectOrganization;
export {
  selectOrganizationDomain,
  selectChanges
};
4

4 回答 4

1

selectOrganizationDomain应该是一个返回.get('organization')状态的函数:

const selectOrganizationDomain = state => state.get('organization');

您的组合选择器应该是调用的结果,createSelector其他选择器函数作为参数传入createSelector

const selectOrganization = createSelector(
  selectOrganizationDomain,
  substate => substate.toJS()
);

const selectChanges = createSelector(
  selectOrganization,
  substate => substate.get('changes')
);
于 2016-12-30T21:04:19.827 回答
1

我认为 createSelector 期望您为第一个参数传递一个选择器,而不是调用选择器的结果:

const selectChanges = () => createSelector(
  selectOrganization, // no ()
  (substate) => substate.get('changes')
)
于 2016-12-30T21:15:07.300 回答
1

问题出在你.toJS()selectOrganization. 我想organization在你的状态树是不可变的。它将您的不可变对象转换为常规的 JS 对象。对于常规对象,get未定义函数。

只需摆脱selectOrganization并尝试selectChanges

const selectChanges = () => createSelector(
  selectOrganizationDomain(),
  (substate) => substate.get('changes')
)
于 2016-12-30T21:09:50.320 回答
0

我解决了这个问题。在我的 routes.js 中,我忘了注入我的减速器/其他模块。这是通过以下方式修复的:

{
      path: '/org',
      name: 'organization',
      getComponent(nextState, cb) {
        const importModules = Promise.all([
          System.import('containers/Organization/reducer'),
          System.import('containers/Organization/sagas'),
          System.import('containers/Organization'),
        ]);

        const renderRoute = loadModule(cb);

        importModules.then(([reducer, sagas, component]) => {
          injectReducer('organization', reducer.default);
          injectSagas(sagas.default);
          renderRoute(component);
        });

        importModules.catch(errorLoading);
      },
    },
于 2016-12-30T21:23:32.370 回答