【发布时间】:2017-06-06 15:34:22
【问题描述】:
我想知道是否有人可以比较和对比 redux reselect lib 与 lodash memoize 之间的差异...?
【问题讨论】:
标签: redux underscore.js lodash memoization reselect
我想知道是否有人可以比较和对比 redux reselect lib 与 lodash memoize 之间的差异...?
【问题讨论】:
标签: redux underscore.js lodash memoization reselect
Lodash's memoize 是一个经典的记忆实用程序:它使用(默认)第一个参数作为缓存键来记忆一个函数。 Lodash 的 memoize 跟踪/缓存使用不同缓存键获得的所有结果。
Reselect 相反,检查每个提供的参数,并且(默认情况下)仅在其中一个参数更改时重新计算结果。 Reselect 的选择器默认缓存大小为 1,主要用于稳定状态派生数据,避免不必要的重新计算。
【讨论】:
const memoizedFunc = _.memoize(
(param1, param2) => param1 + param2
);
console.log(memoizedFunc(1, 2)); // 3
console.log(memoizedFunc(1, 3)); // 3 (but it should be 4!)
请注意,您可以编写自定义 resolver 函数并将其作为第二个参数传递给 _.memoize 以更改此行为,从而将所有或部分参数考虑在内。这是测试和维护的额外逻辑,对您来说可能值得,也可能不值得。 (resolver 函数确定要在 memoized 函数维护的缓存结果 Map 中使用的键。默认情况下,该键仅设置为等于第一个参数。)
注意reselect 主要用于redux 应用程序,使用createSelector 创建记忆选择器。在createSelector 中,每个参数都应该有一个getter(选择器)函数,因为期望与redux 存储一起使用。如果您不尝试从 redux 存储中存储数据,您仍然可以使用它并为每个参数发送像 _.identity 这样的标识函数,但这很愚蠢。
幸运的是,如果您只想记忆函数,并且您希望检查所有参数的更改,您可以使用reselect 的defaultMemoize 并获得所需的行为。
如果您希望检查所有参数的更改,并且不使用redux 或者需要使用createSelector,您可能只想使用专门为此而设计的非常轻量级和快速的库,例如memoize-one。
如果您确实需要createSelector,您可以使用reselect 来满足您的所有需求。
如果您希望缓存所有结果,而不仅仅是最近的结果,您可以单独使用lodash _.memoize,也可以使用customize reselect to use that feature of lodash _.memoize。
【讨论】: