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一个新对象(你提到的)
时稳定选择器的输出
- 当结果函数计算量大
时提高选择器的性能
我对 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一个新对象(你提到的) 时稳定选择器的输出
- 当结果函数计算量大 时提高选择器的性能