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