x => x 类型的结果函数是不必要的吗?

Result functions of type x => x are unnecessary?

我对 Reselect 工作原理的理解可能存在差距。

如果我理解正确的话下面的代码:

const getTemplates = (state) => state.templates.templates;

export const getTemplatesSelector = createSelector(
  [getTemplates],
  templates => templates
);

也可以(或更好)不丢失任何东西,写成:

export const getTemplatesSelector = (state) => state.templates.templates;

这样做的原因,如果我理解正确的话,是 Reselect 检查它的第一个参数,如果它收到 与之前 returns 完全相同的对象 a缓存输出。它不检查值是否相等

Reselect 只会在运行 templates => templates getTemplates returns 一个新对象时,即state.templates.templates 引用一个新对象时。 在这种情况下,输入将 完全 与输入相同,因此使用 Reselect 不会获得 缓存功能

只有当函数(在本例中为 templates => templates)本身 returns 一个新对象时,才能从 Reselect 的缓存功能中获得性能,例如通过 .filter 或 .map 或类似的东西。在这种情况下,虽然返回的对象是相同的,但没有进行任何更改,因此我们无法通过 Reselect 的记忆获得任何收益。

我写的有什么问题吗? 我主要是想确保我正确理解Reselect的工作原理。

-- 编辑 --

我忘了说,我写的是假定对象 state.templates.templates 不变的,即没有突变。

是的,在你的情况下 reselect 不会带来任何好处,因为 getTemplates 是在每次调用时计算的。

2 个最重要的场景 reselect 表现出色的是:

  • 结果函数 returns一个新对象(你提到的)
  • 时稳定选择器的输出
  • 结果函数计算量大
  • 时提高选择器的性能