dependency是object时如何使用useCallback、useMemo和React.memo?

How to use useCallback, useMemo and React.memo when dependency is an object?

我有 useMemo,当它的依赖项之一是我从服务器获得的 Object 时,所以即使对象的内容相同 - useMemo 是在服务器的每次同步中一遍又一遍地调用,因为对象本身每次都不同,当然 useCallbackReact.memo.

是相同的

我该如何解决这个问题?

我正在考虑手动检查新结果是否与以前的结果具有相同的内容,如果是 - 保留以前的对象引用。

真的有两个选择:

  • 按照您的计划进行,即如果对象与您收到的对象深度相等(例如 deep-equal on npm),则不要更改该对象:
    const [obj, setObj] = React.useState();
    // ...
    const newObj = await getObjectFromServer();
    // Using the function form of setState to avoid races and an extra
    // dependency on `obj`:
    setObj(oldObj => equal(newObj, oldObj) ? oldObj : newObj);
    
  • 取决于 memo 使用的字段,而不是完整的对象:
    • 不是这个:
      React.useMemo(() => obj.foo + 8, [obj]);
      
    • 但是这个:
      React.useMemo(() => obj.foo + 8, [obj.foo]);
      
    但是,如果 obj.foo 本身不是基元,这可能很容易变得麻烦并且无济于事。