Skip to content

Commit

Permalink
Fix "Can't perform a React state update on an unmounted component." w…
Browse files Browse the repository at this point in the history
…hen using the `Transition` component (#2374)

* only change flags when mounted

* update changelog
  • Loading branch information
RobinMalfait authored Mar 16, 2023
1 parent fb612f7 commit fc9a625
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 3 deletions.
1 change: 1 addition & 0 deletions packages/@headlessui-react/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed

- Fix focus styles showing up when using the mouse ([#2347](https://github.com/tailwindlabs/headlessui/pull/2347))
- 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))

### Added

Expand Down
26 changes: 23 additions & 3 deletions packages/@headlessui-react/src/hooks/use-flags.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,32 @@
import { useState, useCallback } from 'react'
import { useIsMounted } from './use-is-mounted'

export function useFlags(initialFlags = 0) {
let [flags, setFlags] = useState(initialFlags)
let mounted = useIsMounted()

let addFlag = useCallback((flag: number) => setFlags((flags) => flags | flag), [flags])
let addFlag = useCallback(
(flag: number) => {
if (!mounted.current) return
setFlags((flags) => flags | flag)
},
[flags, mounted]
)
let hasFlag = useCallback((flag: number) => Boolean(flags & flag), [flags])
let removeFlag = useCallback((flag: number) => setFlags((flags) => flags & ~flag), [setFlags])
let toggleFlag = useCallback((flag: number) => setFlags((flags) => flags ^ flag), [setFlags])
let removeFlag = useCallback(
(flag: number) => {
if (!mounted.current) return
setFlags((flags) => flags & ~flag)
},
[setFlags, mounted]
)
let toggleFlag = useCallback(
(flag: number) => {
if (!mounted.current) return
setFlags((flags) => flags ^ flag)
},
[setFlags]
)

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

0 comments on commit fc9a625

Please sign in to comment.