useLatest
用法
loading
源码
ts
import { useRef } from 'react';
function useLatest<T>(value: T) {
const ref = useRef(value);
ref.current = value;
return ref;
}
export default useLatest;
tsx
import React, { useState, useEffect, useRef } from 'react'
import { useLatest } from 'ahooks'
export default () => {
const [useLatestCount, setUseLatestCount] = useState(0)
const [defaultCount, setDefaultCount] = useState(0)
const latestCountRef = useLatest(useLatestCount)
useEffect(() => {
const interval = setInterval(() => {
setUseLatestCount(latestCountRef.current + 1)
}, 1000)
return () => clearInterval(interval)
}, [])
useEffect(() => {
const interval = setInterval(() => {
setDefaultCount(defaultCount + 1)
}, 1000)
return () => clearInterval(interval)
}, [])
return (
<>
<p>count(useLatest): {useLatestCount}</p>
<p>count(default): {defaultCount}</p>
</>
)
}
解读
相较于 useRef
,多了一行赋值的代码。
ts
import { useRef } from 'react';
function useLatest<T>(value: T) {
const ref = useRef(value);
ref.current = value;
return ref;
}
export default useLatest;
那直接在 demo.tsx
使用 useRef
实现。
tsx
import React, { useState, useEffect, useRef } from 'react'
import { useLatest } from 'ahooks'
export default () => {
const [useLatestCount, setUseLatestCount] = useState(0)
const [defaultCount, setDefaultCount] = useState(0)
const latestCountRef = useLatest(useLatestCount)
const latestCountRef = useRef(useLatestCount)
latestCountRef.current = useLatestCount
useEffect(() => {
const interval = setInterval(() => {
setUseLatestCount(latestCountRef.current + 1)
}, 1000)
return () => clearInterval(interval)
}, [])
useEffect(() => {
const interval = setInterval(() => {
setDefaultCount(defaultCount + 1)
}, 1000)
return () => clearInterval(interval)
}, [])
return (
<>
<p>count(useLatest): {useLatestCount}</p>
<p>count(default): {defaultCount}</p>
</>
)
}
使用 useRef
包装一层,并返回一个 ref
对象,确保每次获取的值都是最新的。