如何使用钩子设置常量“状态”变量?

VDo*_*Dog 0 javascript reactjs react-hooks

假设我有一些状态变量width,并且我知道它永远不会改变,但我需要根据我收到的道具对其进行一些计算。我不想在函数体内执行此操作,因为它将在每次重新渲染时运行。所以:

const SOME_CONSTANT_NUMBER = 50;

const someFunc = ({multiplier: number}) => {
  const [width, setWidth] = useState(SOME_CONSTANT_NUMBER * multiplier);

  return (
    <div>
      {width}
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

现在我还实例化了一个setWidth我永远不会使用的函数。

我可以使用钩子仅在安装时运行,但这需要更多代码,而且不是必需的。

const SOME_CONSTANT_NUMBER = 50;

const someFunc = ({multiplier: number}) => {
  const [width, setWidth] = useState(0);

  useHook(() => {
    const updatedWidth = SOME_CONSTANT_NUMBER * multiplier;
    setWidth(updatedWidth);
  }, []);

  return (
    <div>
      {width}
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

我认为最糟糕的方法如下,因为它会在每次重新渲染时计算它:

const SOME_CONSTANT_NUMBER = 50;

const someFunc = ({multiplier: number}) => {
  const width = SOME_CONSTANT_NUMBER * multiplier;
  return (
    <div>
      {width}
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

*注意这个例子很简单,但假设有更多的道具,并且计算量width很大。

Jon*_*lms 6

正是useMemo针对该用例。

 const width = useMemo(() => SOME_CONSTANT_NUMBER * multiplier, [multiplier]);
Run Code Online (Sandbox Code Playgroud)

请注意,它本身带有成本(它是另一个函数),因此只有当您知道计算该值确实成本高昂时才useMemo应该使用它,这意味着:导致滞后(如果不是,您应该真正检查性能,以及是否会增加它)。useMemo

  • ⚠ 注意!这个答案可能会产生误导。来自 useRef 文档:“您可以依赖 useMemo 作为性能优化,而不是作为语义保证。将来,React 可能会选择“忘记”一些先前存储的值并在下一次渲染时重新计算它们 [...]”。我来寻找一个有保证的稳定值,因为这似乎就是问题所要求的,但 useMemo 不是它。即,如果您的代码在使用和不使用 useMemo 的情况下工作得完全相同,那么您就很好,否则您就使用错误了。 (2认同)