Skip to content
霞露小伙 — HfWang
On this page

useLatest

返回当前最新值的 Hook,可以避免闭包问题。

其实就是返回一个 ref

原码

ts
import { useRef } from 'react';

function useLatest<T>(value: T) {
	const ref = useRef(value);
	ref.current = value;
	return ref;
}

export default useLatest;

使用

使用场景, 如下例子,组件挂载后会在 3 秒后打印 num,,那如果在 3 秒内点击 + 按钮,num 变成了 1,但是最终输出的结果确还是 2, 这就是 useEffect 的闭包陷阱

通常我们使用 useRef 来答题 useState 或者给 useEffect 的 deps 中加上 num 来解决

而 useLatest 就是利用 useRef 这个方案

tsx
const Demo = () => {
	const [num, setNum] = useState(0);
	useEffect(() => {
		setTimeout(() => console.log(num), 3000);
	}, []);

	const handleClick = () => {
		setNum(n => n++);
	};
	return (
		<div>
			<p>{num}</p>
			<button onClick={handleClick}>+</button>
		</div>
	);
};

-------------------使用 useLatest 修改后--------------------->

tsx
const Demo = () => {
	const num = useLatest(0);
	useEffect(() => {
		setTimeout(() => console.log(num.currennt), 3000);
	}, []);

	const handleClick = () => {
		num.current++;
	};
	return (
		<div>
			<p>{num}</p>
			<button onClick={handleClick}>+</button>
		</div>
	);
};

本站中引用到的其他资料,如有侵权,请联系本人删除