Javascript Redux重新选择-带参数输入的选择器正在重新计算
我有以下选择器:Javascript Redux重新选择-带参数输入的选择器正在重新计算,javascript,reactjs,redux,react-redux,reselect,Javascript,Reactjs,Redux,React Redux,Reselect,我有以下选择器: const getAllAddresses = (withStartEnd) => createSelector( [getAllAddressesSelector, getStartAddressSelector, getEndAddressSelector], (all, startAddress, endAddress) => { if (!withStartEnd) return [...Ob
const getAllAddresses = (withStartEnd) =>
createSelector(
[getAllAddressesSelector, getStartAddressSelector, getEndAddressSelector],
(all, startAddress, endAddress) => {
if (!withStartEnd) return [...Object.values(all)];
return [startAddress, ...Object.values(all), endAddress];
}
);
我注意到选择器每次都在重新计算,all
、startAddress
和endAddress
不改变时的事件。如果我删除选择器函数的输入,如下所示:
const getAllAddresses = (
createSelector(
[getAllAddressesSelector, getStartAddressSelector, getEndAddressSelector],
(all, startAddress, endAddress) => {
return [startAddress, ...Object.values(all), endAddress];
}
)
);
然后一切按预期进行,选择器不会在每次调用时重新计算。似乎我在选择器概念中遗漏了一些东西。任何帮助都将不胜感激。更新: 请参阅 简而言之:只有在
mapstatetops
之外传递静态参数并创建工厂函数时,您这样做才有效。对于动态参数,它更复杂,请遵循我前面提到的参考资料
每次调用mapStateToProps
时都会重新计算选择器的原因是调用getAllAddresses
将创建createSelector
的新实例,并且备忘录将不起作用
原始答案: 简而言之,
reselect
根据身份检查确定输入选择器的更改
因此,如果您的输入选择器总是创建并返回一个新对象或数组,那么每次都会重新计算选择器
为了解决重新计算问题:
重新选择文档:
(请点击链接,这里有很好的例子)
检查您的备忘功能是否与状态更新功能兼容(即,如果您使用的是Redux,则为reducer)。例如,使用createSelector创建并意外重新计算的选择器可能在每次更新时接收到新对象,无论其包含的值是否已更改。createSelector使用标识检查(==)检测输入是否已更改,因此在每次更新时返回新对象意味着选择器将在每次更新时重新计算
谢谢@Jordan。但为什么在我的第二个例子中它不重新计算?我还每次创建一个新数组。唯一的区别是,第一个示例除了输入之外,第二个示例没有输入。我错过了什么?不客气。请参考我的最新答案。谢谢