7

我想知道是否有人可以比较和对比 redux reselect lib 与 lodash memoize 之间的差异......?

4

2 回答 2

7

Lodash 的 memoize是一个经典的 memoizing 实用程序:它使用(默认情况下)第一个参数作为缓存键来记忆一个函数。Lodash 的 memoize 跟踪/缓存使用不同缓存键获得的所有结果。

而是重新选择,检查每个提供的参数,并且(默认情况下)仅在其中一个参数更改时重新计算结果。Reselect 的选择器默认缓存大小为 1,主要用于稳定状态派生数据,避免不必要的重新计算。

于 2017-04-26T15:32:19.300 回答
7

有2个主要区别:

  1. 是在重新计算之前检查所有参数的变化,还是只检查第一个?
  2. 是所有结果都缓存了,还是只缓存了最近的结果?

lodash _.memoize:

  • 仅检查第一个参数的更改并返回该第一个参数的最新结果,而不管其他参数是否已更改(默认情况下)。
  • 保留由第一个参数键入的所有结果值的无限大记录。

lodash _.memoize 的问题案例示例:

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(选择器)函数,因为期望与reduxstore 一起使用。如果您不尝试从redux存储中存储数据,您仍然可以使用它并像每个参数一样发送一个身份函数_.identity,但这很愚蠢。

幸运的是,如果您只想记忆函数,并且希望检查所有参数的更改,您可以使用reselect'sdefaultMemoize并获得所需的行为。

摘要/其他库(memoize-one)

如果您希望检查所有参数的更改,并且不使用redux或需要使用createSelector,您可能只想使用专门为此而设计的非常轻量级和快速的库,例如memoize-one.

如果您确实想要createSelector,您最有可能只使用reselect您的所有需求。

如果您希望缓存所有结果,而不仅仅是最近的结果,您可以lodash _.memoize单独使用,也可以自定义reselect使用lodash _.memoize.

于 2018-07-26T20:22:15.630 回答