背景
react-compound-timer
库的useTimer Hook实现
有这么段代码:
const timer = useMemo(
() =>
new TimerModel({
initialTime,
direction,
timeToUpdate,
lastUnit,
checkpoints,
onChange: (timerValue: TimerValue) =>
setTimerValues(state => ({ ...state, ...timerValue })),
}),
[],
);
useMemo
的依赖是空数组,所以变量timer
在组件生命周期里都不会变化,有点类似实例变量。但是Hooks里实现实例变量不是useRef
的特长吗?这里为啥使用的是useMemo
?
useMemo
代替useRef
?
如果只是实现实例变量,那么 useMemo
是否可以代替useRef
?如:
const ref = useRef(null);
const ref2 = useMemo(() => { current: null }, []);
使用上没问题,但不是最佳实践。
useMemo
会跟踪依赖项,并且通过比较依赖项是否发生变化决定是否重新执行函数。即使依赖项是个空数组,但是内部还是会做部分额外的逻辑。所以性能上比useRef
要差。- React对
useMemo
定位只是用于性能优化,并不保证在依赖项不变时,就一定不会重新执行函数。
You may rely on useMemo as a performance optimization, not as a semantic guarantee.
useMemo() is a hint — not a guarantee. React may still choose to “forget” some memoized values to reclaim memory. Don’t rely on it for correctness
所以对于那些确定不需要重新计算的值,则优先使用useRef
,不要使用useMemo
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。