Skip to content

Commit cf9a8a6

Browse files
authored
Merge pull request #78 from eps1lon/update-use-latest-rule
Update advanced-use-latest rule to recommend useEffectEvent
2 parents dd157cb + a74efd7 commit cf9a8a6

1 file changed

Lines changed: 8 additions & 18 deletions

File tree

skills/react-best-practices/rules/advanced-use-latest.md

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,14 @@
11
---
2-
title: useLatest for Stable Callback Refs
2+
title: useEffectEvent for Stable Callback Refs
33
impact: LOW
44
impactDescription: prevents effect re-runs
5-
tags: advanced, hooks, useLatest, refs, optimization
5+
tags: advanced, hooks, useEffectEvent, refs, optimization
66
---
77

8-
## useLatest for Stable Callback Refs
8+
## useEffectEvent for Stable Callback Refs
99

1010
Access latest values in callbacks without adding them to dependency arrays. Prevents effect re-runs while avoiding stale closures.
1111

12-
**Implementation:**
13-
14-
```typescript
15-
function useLatest<T>(value: T) {
16-
const ref = useRef(value)
17-
useLayoutEffect(() => {
18-
ref.current = value
19-
}, [value])
20-
return ref
21-
}
22-
```
23-
2412
**Incorrect (effect re-runs on every callback change):**
2513

2614
```tsx
@@ -34,15 +22,17 @@ function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
3422
}
3523
```
3624

37-
**Correct (stable effect, fresh callback):**
25+
**Correct (using React's useEffectEvent):**
3826

3927
```tsx
28+
import { useEffectEvent } from 'react';
29+
4030
function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
4131
const [query, setQuery] = useState('')
42-
const onSearchRef = useLatest(onSearch)
32+
const onSearchEvent = useEffectEvent(onSearch)
4333

4434
useEffect(() => {
45-
const timeout = setTimeout(() => onSearchRef.current(query), 300)
35+
const timeout = setTimeout(() => onSearchEvent(query), 300)
4636
return () => clearTimeout(timeout)
4737
}, [query])
4838
}

0 commit comments

Comments
 (0)