Skip to content

Commit fc9a625

Browse files
authored
Fix "Can't perform a React state update on an unmounted component." when using the Transition component (#2374)
* only change flags when mounted * update changelog
1 parent fb612f7 commit fc9a625

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

packages/@headlessui-react/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Fixed
1111

1212
- Fix focus styles showing up when using the mouse ([#2347](https://github.com/tailwindlabs/headlessui/pull/2347))
13+
- Fix "Can't perform a React state update on an unmounted component." when using the `Transition` component ([#2374](https://github.com/tailwindlabs/headlessui/pull/2374))
1314

1415
### Added
1516

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,32 @@
11
import { useState, useCallback } from 'react'
2+
import { useIsMounted } from './use-is-mounted'
23

34
export function useFlags(initialFlags = 0) {
45
let [flags, setFlags] = useState(initialFlags)
6+
let mounted = useIsMounted()
57

6-
let addFlag = useCallback((flag: number) => setFlags((flags) => flags | flag), [flags])
8+
let addFlag = useCallback(
9+
(flag: number) => {
10+
if (!mounted.current) return
11+
setFlags((flags) => flags | flag)
12+
},
13+
[flags, mounted]
14+
)
715
let hasFlag = useCallback((flag: number) => Boolean(flags & flag), [flags])
8-
let removeFlag = useCallback((flag: number) => setFlags((flags) => flags & ~flag), [setFlags])
9-
let toggleFlag = useCallback((flag: number) => setFlags((flags) => flags ^ flag), [setFlags])
16+
let removeFlag = useCallback(
17+
(flag: number) => {
18+
if (!mounted.current) return
19+
setFlags((flags) => flags & ~flag)
20+
},
21+
[setFlags, mounted]
22+
)
23+
let toggleFlag = useCallback(
24+
(flag: number) => {
25+
if (!mounted.current) return
26+
setFlags((flags) => flags ^ flag)
27+
},
28+
[setFlags]
29+
)
1030

1131
return { flags, addFlag, hasFlag, removeFlag, toggleFlag }
1232
}

0 commit comments

Comments
 (0)