网站搜索

javascript - 为什么 useMemo 不起作用?我是用错了吗?


所以我刚刚开始掌握 useMemo 和 useCallback,并在尝试了解事情是如何运作的。我在这种情况下想要做的是,当父组件传递相同的对象时,不去渲染子组件。

这是我的父组件:

const Parent = () => {
  const [value, setValue] = useState(0);
  const handleOnClick = e => {
    setValue(value + 1);
  };

  const myObject = useMemo(() => {
    return { value: value - value };
  }, [value]);

  return (
    <div>
      <h1>I am a parent</h1>
      <button onClick={handleOnClick}>
        Click on Me
      </button>
      <Child object={myObject} />
    </div>
  );
};

export default Parent;

这是我的子组件,它在每次点击时都会重新渲染,尽管“myObject”的内容是相同的。(我知道每次引用都会改变,但我的理解是 useMemo 就是用来解决这个问题的)

const Child = ({ object }) => {
  return (
    <div>
      <h1>I am child</h1>
      <p>Object is {JSON.stringify(object)}</p>
    </div>
  );
};

export default React.memo(Child);

这里是沙箱。

请告诉我我哪里做错了,以及这个情况的解决方案是什么?

答案#1

依赖数组决定了缓存什么时候失效。如果数组中的任何内容发生了变化,那么缓存就会重新运行。然而,React 只检查那个数组,而不是最终的结果。

现在你告诉它每当 value 变化时重新计算。如果 value 不是你想要的,你可以给数组提供其他内容。你给出的 value - value 的例子没有多大意义,因为它永远不会变化,所以让我来替换它,这样它会有一半时间发生变化:

const Parent = () => {
  const [value, setValue] = useState(0);
  const handleOnClick = e => {
    setValue(value + 1);
  };

  const halfValue = Math.round(value / 2);
  const myObject = useMemo(() => {
    return { halfValue: halfValue };
  }, [halfValue]);

  return (
    <div>
      <h1>I am a parent</h1>
      <button onClick={handleOnClick}>
        Click on Me
      </button>
      <Child object={myObject} />
    </div>
  );
};

现在每隔一次点击,备忘就会被重新计算。