记忆选择器更新不在组合选择器中触发

时间:2016-12-13 17:18:30

标签: javascript redux memoization reselect

我在redux环境中使用重新选择记忆选择器。请注意在readme中重新选择这些选择器是可组合的 - 也就是说,一个选择器可以被另一个选择器使用。以下是我的选择:

import { createSelector } from 'reselect';

const getUser = (state) => state.user;
const getRegions = (state) => state.regions;
const getSelectedRegion = (state) => state.selectedRegion;
const getSeals = (state) => state.seals;
const getSignatures = (state) => state.signatures;

export const userData = createSelector(
  [ getUser, getSeals, getSignatures ],
  (user, seals, signatures) => {
    if(user === null) return user;
    user.seals = seals.filter(seal => seal.userEmail === user.email);
    user.signatures = signatures.filter(signature => signature.userEmail === user.email);
    user.isRoot = user.roles.includes('root');
    user.isEngineer = user.roles.includes('engineer');
    return user;
  }
);

export const sealForSelectedRegion = createSelector(
  [ userData, getSelectedRegion ],
  (user, selectedRegion) => {
    let sealForSelectedRegion = user.seals.find(seal => seal.region === selectedRegion.name);
    return sealForSelectedRegion;
  }
);

请注意userData选择器如何使用sealForSelectedRegion选择器。但是,使用和调试这些选择器表明,当userData被触发并产生新输出时,不会触发sealForSelectedRegion。我的想法是它应该被触发,因为它的输入userData产生了更新的结果,因此需要重新计算`sealForSelectedRegion。但这不会发生。

上面列出的重新选择自述文件中也出现了类似的情况。我能看到的唯一区别是不会导出自述文件中组成的选择器。在这个例子中,我想要导出userData并将其用作sealForSelectedRegion的输入。

所以问题是为什么userData的更新输出不会触发sealForSelectedRegion?是因为userData被导出了吗?如果是这样,为什么这是一个问题?

0 个答案:

没有答案