【发布时间】:2021-04-29 14:00:26
【问题描述】:
我不明白为什么useCallback 每次更新一个部门时总是返回一个新的参考。这会导致React.memo() 可以避免的许多重新渲染。
useCallback 的这个实现有什么问题(如果有的话)?
export function useCallback(callback) {
const callbackRef = useRef();
callbackRef.current = callback;
return useState(() =>
(...args) => callbackRef.current(...args)
)[0];
}
使用它而不是内置实现肯定会对性能产生显着的积极影响。
自己的结论:
没有理由不使用使用 ref 的实现,只要您了解其含义,即,正如@Bergy 所指出的,您不能存储回调以供稍后使用(例如在 setTimeout 之后),并期望回调具有与同步调用它相同的效果。
然而,在我看来,这是首选行为,所以没有缺点????。
【问题讨论】:
-
我猜默认行为是在回调函数需要更改时保持重新渲染,但避免每次内联回调时重新渲染整个树(每次渲染都创建新的,不管部门)。
-
如果你想要相同的引用,那么你应该使用没有依赖关系的
useCallback(..., [])。如果它取决于某些状态,则每次更改时都必须获取新值。这就是为什么 useCallback 需要使用一个新函数。 -
好问题。我建议删除 Typescript 和 eslint 部分,因为它们与问题无关。
-
@BeS 使用这个使用回调的实现而不是默认的,你会看到,它的工作原理也一样。
标签: javascript reactjs react-hooks usecallback