useMemo() 如何为其工厂创建一个 id?

How does useMemo() create an id for its factories?

React 中有一个函数叫做 useMemo()

const eg = React.useMemo(() => true, []);

如果我两次包含同一个函数,它怎么知道要记忆哪个 return?

const eg1 = React.useMemo(() => Math.random(), []);
const eg2 = React.useMemo(() => Math.random(), []);

这两个箭头函数都没有明确的 ID,而且——据我所知——除了可能对它们的内部文本进行散列处理之外,没有办法对它们进行 ID 识别。在这种情况下,他们将拥有相同的 ID。

这里发生了什么时髦的魔法?

根据我对 useMemo 的理解,它只是无法记住并且由于缺少参数而总是重新计算值。

useMemo在函数参数相同的情况下避免计算,如果没有参数,每次渲染都会计算一个新值。

React 知道哪个是哪个,因为它假设您总是以完全相同的顺序调用 useMemo 完全相同的次数。因此,它知道您在渲染期间第一次调用 useMemo 时,它应该检查上次第一次调用的依赖数组,以及 return 第一个值。然后你第二次调用 useMemo,它检查第二个依赖数组和 returns 第二个值。等等

这就是 rules of hooks 坚持不能有条件地调用挂钩的原因。