3

我在 redux 环境中将 reselect 用于记忆选择器。请注意,在 reselect 的自述文件中,这些选择器是可组合的——也就是说,一个选择器可以被另一个选择器使用。这是我的选择器:

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出口吗?如果是这样,为什么这是一个问题?

4

0 回答 0