Skip to content

Commit

Permalink
fix(components): suppress unnecessary re-renders of Checkbox and Radi…
Browse files Browse the repository at this point in the history
…o component (#8349)

* fix(components): suppress unnecessary re-renders of Checkbox and Radio component

* fix(components): ensure global event listeners are set up
  • Loading branch information
autologie committed Mar 11, 2024
1 parent 4f5c273 commit bb3ce66
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 6 deletions.
5 changes: 5 additions & 0 deletions .changeset/metal-mangos-judge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chakra-ui/react": minor
---

Suppress unnecessary re-renders of Checkbox and Radio component
6 changes: 3 additions & 3 deletions packages/components/src/checkbox/use-checkbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ export function useCheckbox(props: UseCheckboxProps = {}) {
const [isActive, setActive] = useState(false)

useEffect(() => {
return trackFocusVisible(setIsFocusVisible)
}, [])
return trackFocusVisible((value) => setIsFocusVisible(value && isFocused))
}, [isFocused])

const inputRef = useRef<HTMLInputElement>(null)
const [rootIsLabelElement, setRootIsLabelElement] = useState(true)
Expand Down Expand Up @@ -175,7 +175,7 @@ export function useCheckbox(props: UseCheckboxProps = {}) {
"data-hover": dataAttr(isHovered),
"data-checked": dataAttr(isChecked),
"data-focus": dataAttr(isFocused),
"data-focus-visible": dataAttr(isFocused && isFocusVisible),
"data-focus-visible": dataAttr(isFocusVisible),
"data-indeterminate": dataAttr(isIndeterminate),
"data-disabled": dataAttr(isDisabled),
"data-invalid": dataAttr(isInvalid),
Expand Down
6 changes: 3 additions & 3 deletions packages/components/src/radio-group/use-radio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ export function useRadio(props: UseRadioProps = {}) {
const isChecked = isControlled ? isCheckedProp : isCheckedState

useEffect(() => {
return trackFocusVisible(setIsFocusVisible)
}, [])
return trackFocusVisible((value) => setIsFocusVisible(value && isFocused))
}, [isFocused])

const handleChange = useCallback(
(event: React.ChangeEvent<HTMLInputElement>) => {
Expand Down Expand Up @@ -187,7 +187,7 @@ export function useRadio(props: UseRadioProps = {}) {
"data-invalid": dataAttr(isInvalid),
"data-checked": dataAttr(isChecked),
"data-focus": dataAttr(isFocused),
"data-focus-visible": dataAttr(isFocused && isFocusVisible),
"data-focus-visible": dataAttr(isFocusVisible),
"data-readonly": dataAttr(isReadOnly),
"aria-hidden": true,
onMouseDown: callAllHandlers(props.onMouseDown, () => setActive(true)),
Expand Down

0 comments on commit bb3ce66

Please sign in to comment.