比较&对比度redux reselect vs lodash / underscore memoize ...?

时间:2017-01-21 20:25:53

标签: redux underscore.js lodash memoization reselect

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

2 个答案:

答案 0 :(得分:6)

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

相反,

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

答案 1 :(得分:4)

有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,以更改此行为,从而考虑所有或某些参数。这是测试和维护的额外逻辑,对您而言可能不值得。 (解析器功能确定备注功能所维护的缓存结果映射中要使用的键。默认情况下,该键仅设置为等于第一个参数。)

重新选择:

  • 检查所有参数是否与仅运行前的时间相等。
  • 仅缓存单个结果(上一次运行)。

请注意,reselect主要用于redux应用程序,并使用createSelector创建记录选择器。在createSelector中,由于期望与redux存储一起使用,因此每个参数均应具有吸气(选择器)功能。如果您不打算记住redux存储区中的数据,您仍然可以使用它并为每个参数发送_.identity这样的标识函数,但这很愚蠢。

幸运的是,如果您只想记住函数,并且希望检查所有参数的更改,则可以使用reselect的{​​{1}}并获得所需的行为。

摘要/其他库(存储一个)

如果要检查所有参数的更改,并且不使用defaultMemoize或需要使用redux,则可能只想使用专门用于此目的的轻量级且快速的库,例如memoize-one

如果您确实想要createSelector,则可以将createSelector用于最有可能的所有需求。

如果要缓存所有结果,而不仅仅是最后一个,可以单独使用reselect,也可以customize reselect to use that feature of lodash _.memoize