useBoolean — вспомогательный хук библиотеки
Chakra UI, предназначенный для удобного управления
логическими значениями (true / false). Он
упрощает работу со состояниями, которые имеют бинарную природу:
открыто/закрыто, активно/неактивно, включено/выключено.
Во многих интерфейсах требуется переключать флаги состояния:
модальные окна, боковые панели, всплывающие элементы, состояния
загрузки, отображение дополнительных блоков интерфейса. Обычная
реализация через useState требует писать вспомогательные
функции для изменения значения. useBoolean решает эту
задачу, предоставляя готовый набор методов управления состоянием.
Хук входит в пакет @chakra-ui/react и использует
стандартный механизм React Hooks.
import { useBoolean } from "@chakra-ui/react"
Хук доступен сразу после установки Chakra UI, отдельной установки не требуется.
const [value, setValue] = useBoolean(initialState)
Параметры:
initialState — начальное логическое значение
(true или false)Возвращаемые значения:
value — текущее состояниеsetValue — объект с функциями управления
состояниемОбъект управления содержит несколько методов:
| Метод | Назначение |
|---|---|
on |
устанавливает значение true |
off |
устанавливает значение false |
toggle |
переключает состояние |
set |
устанавливает конкретное значение |
import { Button } from "@chakra-ui/react"
import { useBoolean } from "@chakra-ui/react"
function Example() {
const [isOpen, setIsOpen] = useBoolean()
return (
<>
<Button onCl ick={setIsOpen.toggle}>
Toggle
</Button>
{isOpen && <div>Контент отображается</div>}
</>
)
}
В этом примере:
isOpen хранит логическое значениеtoggle переключает его между true и
falseПо умолчанию состояние равно false, но можно задать
начальное значение.
const [isVisible, setIsVisible] = useBoolean(true)
Теперь компонент начинает работу с состоянием true.
on и offИногда необходимо не переключать состояние, а явно устанавливать значение.
function Example() {
const [isOpen, setIsOpen] = useBoolean()
return (
<>
<Button onCl ick={setIsOpen.on}>
Открыть
</Button>
<Button onCl ick={setIsOpen.off}>
Закрыть
</Button>
</>
)
}
Преимущества:
toggletoggle — самый часто используемый метод.
setIsOpen.toggle()
Он автоматически меняет значение:
true → false
false → true
Используется в интерфейсах:
setПозволяет установить конкретное значение.
setIsOpen.set(true)
setIsOpen.set(false)
Пример:
function Example() {
const [loading, setLoading] = useBoolean()
const startLoading = () => {
setLoading.set(true)
}
const stopLoading = () => {
setLoading.set(false)
}
return (
<div>
{loading && <p>Загрузка...</p>}
</div>
)
}
useStateСтандартный подход React:
const [isOpen, setIsOpen] = useState(false)
const open = () => setIsOpen(true)
const close = () => setIsOpen(false)
const toggle = () => setIsOpen(prev => !prev)
Использование useBoolean:
const [isOpen, setIsOpen] = useBoolean()
Доступные методы:
setIsOpen.on()
setIsOpen.off()
setIsOpen.toggle()
Преимущества:
Типичный сценарий использования — управление модальными окнами.
import {
Button,
Modal,
ModalOverlay,
ModalContent,
useBoolean
} from "@chakra-ui/react"
function ModalExample() {
const [isOpen, setIsOpen] = useBoolean()
return (
<>
<Button onCl ick={setIsOpen.on}>
Открыть модальное окно
</Button>
<Modal isOpen={isOpen} onCl ose={setIsOpen.off}>
<ModalOverlay />
<ModalContent>
Контент модального окна
</ModalContent>
</Modal>
</>
)
}
Здесь:
setIsOpen.on открывает модальное окноsetIsOpen.off закрывает егоХук часто используется для отображения и скрытия элементов интерфейса.
function ToggleContent() {
const [visible, setVisible] = useBoolean()
return (
<>
<Button onCl ick={setVisible.toggle}>
Показать / скрыть
</Button>
{visible && (
<div>
Дополнительная информация
</div>
)}
</>
)
}
function LoadingExample() {
const [loading, setLoading] = useBoolean()
const fetchData = async () => {
setLoading.on()
await new Promise(resolve => setTimeout(resolve, 2000))
setLoading.off()
}
return (
<>
<Button onCl ick={fetchData}>
Загрузить данные
</Button>
{loading && <p>Загрузка...</p>}
</>
)
}
Switchimport { Switch } from "@chakra-ui/react"
function SwitchExample() {
const [enabled, setEnabled] = useBoolean()
return (
<Switch
isChecked={enabled}
onCha nge={setEnabled.toggle}
/>
)
}
Collapseimport { Button, Collapse, Box } from "@chakra-ui/react"
function CollapseExample() {
const [show, setShow] = useBoolean()
return (
<>
<Button onCl ick={setShow.toggle}>
Toggle
</Button>
<Collapse in={show}>
<Box p="4" bg="gray.100">
Скрываемый контент
</Box>
</Collapse>
</>
)
}
Иногда требуется связать несколько элементов интерфейса с одним boolean-состоянием.
function SidebarExample() {
const [isOpen, setIsOpen] = useBoolean()
return (
<>
<Button onCl ick={setIsOpen.toggle}>
Меню
</Button>
{isOpen && (
<aside>
Боковая панель
</aside>
)}
</>
)
}
Иногда удобно сразу извлечь методы.
const [isOpen, { on, off, toggle }] = useBoolean()
Использование:
<Button onCl ick={on}>Открыть</Button>
<Button onCl ick={off}>Закрыть</Button>
<Button onCl ick={toggle}>Переключить</Button>
Такой подход делает код более лаконичным.
useBoolean особенно полезен при реализации:
UI-компонентов:
Логических состояний:
Управление интерфейсом:
useBooleanХук оптимален в ситуациях, когда состояние:
Если состояние содержит больше вариантов (loading,
error, success), предпочтительнее использовать
useState.
Использование useBoolean улучшает архитектуру
компонентов:
Читаемость
setMenu.on()
setMenu.off()
вместо
setMenu(true)
setMenu(false)
Единый стандарт управления
Все boolean-состояния управляются одинаково.
Снижение количества вспомогательных функций
Не требуется писать open, close,
toggle.
useBoolean часто используется вместе с:
useDisclosureuseToggleuseBreakpointValueuseOutsideClickПример совместного использования:
function Example() {
const [open, setOpen] = useBoolean()
const ref = useRef()
useOutsideClick({
ref: ref,
handler: setOpen.off
})
return (
<div ref={ref}>
{open && <p>Контент</p>}
</div>
)
}
useBoolean не добавляет дополнительных накладных
расходов:
useStateПоэтому его использование безопасно даже в часто обновляемых компонентах.
useBoolean предоставляет компактный API для управления
логическими состояниями:
on() → true
off() → false
toggle() → переключение
set(v) → установка значения
Использование этого хука делает код интерфейса:
Он широко применяется в компонентах Chakra UI и считается стандартным инструментом для управления бинарными состояниями интерфейса.