dependency是object时如何使用useCallback、useMemo和React.memo?
How to use useCallback, useMemo and React.memo when dependency is an object?
我有 useMemo
,当它的依赖项之一是我从服务器获得的 Object
时,所以即使对象的内容相同 - useMemo
是在服务器的每次同步中一遍又一遍地调用,因为对象本身每次都不同,当然 useCallback
和 React.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
本身不是基元,这可能很容易变得麻烦并且无济于事。
我有 useMemo
,当它的依赖项之一是我从服务器获得的 Object
时,所以即使对象的内容相同 - useMemo
是在服务器的每次同步中一遍又一遍地调用,因为对象本身每次都不同,当然 useCallback
和 React.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
本身不是基元,这可能很容易变得麻烦并且无济于事。 - 不是这个: