useToggle
Description
useToggle is a hook for managing a boolean state with a single toggle method. It returns a hybrid structure that supports both tuple and object destructuring.
toggle semantics:
- without an argument — flips the current value
true ⇄ false; - with
true/false— forces the provided value.
Signature
ts
function useToggle(initialValue?: boolean): UseToggleReturn;Parameters
initialValue?: boolean— initial value; defaults tofalse.
Returns:
UseToggleReturn— a hybrid structure with fields/positions:value: boolean— current value;toggle(force?: boolean): void— flip the value or set it explicitly;- tuple access:
[value, toggle].
Examples
1) Basic usage (tuple)
tsx
import { useToggle } from '@webeach/react-hooks';
export function PasswordField() {
const [visible, toggle] = useToggle(false);
return (
<label>
<input type={visible ? 'text' : 'password'} />
<button type="button" onClick={() => toggle()}>
{visible ? 'Hide' : 'Show'}
</button>
</label>
);
}2) Force a specific value
tsx
import { useToggle } from '@webeach/react-hooks';
export function Filters() {
const state = useToggle(true);
return (
<div>
<button onClick={() => state.toggle(false)}>Disable</button>
<button onClick={() => state.toggle(true)}>Enable</button>
<button onClick={() => state.toggle()}>Toggle</button>
<div>Enabled: {String(state.value)}</div>
</div>
);
}3) Keyboard control
tsx
import { useEffect } from 'react';
import { useToggle } from '@webeach/react-hooks';
export function KeyboardControlled() {
const { value, toggle } = useToggle(false);
useEffect(() => {
const onKey = (e: KeyboardEvent) => {
if (e.key === 't') toggle(); // flip
if (e.key === '1') toggle(true); // force on
if (e.key === '0') toggle(false); // force off
};
window.addEventListener('keydown', onKey);
return () => window.removeEventListener('keydown', onKey);
}, [toggle]);
return <div>Active: {String(value)}</div>;
}Behavior
Simple state model
- Stores a single boolean value (
useState).
- Stores a single boolean value (
Memoized action
toggleis memoized withuseCallbackand is stable between renders.- The function keeps reference identity, so it’s safe to include in
useEffect/useCallbackdependency arrays.
Hybrid structure
- Thanks to
useDemandStructure, both tuple and object forms are available without duplicate computations.
- Thanks to
No side effects
- SSR/ISR‑safe; no access to global browser objects.
When to Use
- UI toggles: show/hide, on/off, open/close.
- When a single universal action
toggle(force?)is convenient for both flipping and forcing a value.
When Not to Use
- If you need more than
true/false(e.g., a tri‑state flag) — useuseStatewith an enum or a specialized hook. - If you need complex transition logic — consider
useReducer.
Common Mistakes
Expecting
setTrue/setFalseto exist- This hook exposes only
valueandtoggle(force?). For explicit actions, useuseBoolean.
- This hook exposes only
Wrong effect dependencies
- In effects, depend on
toggle, notvalue, if the logic doesn’t rely on the current boolean.
- In effects, depend on
Passing
toggledirectly to event handlers- Using
onClick={toggle}passes the event object as theforceargument, which is truthy and will act liketoggle(true). Wrap it instead:onClick={() => toggle()}or set a value explicitly:onClick={() => toggle(false)}/onClick={() => toggle(true)}.
- Using
Typing
Exported types
UseToggleFunction- Boolean state updater:
(force?: boolean) => void.- No argument — inverts the current value.
true/false— sets the value explicitly.
- Boolean state updater:
UseToggleReturn- Hybrid: tuple
[value, toggle]and object{ value, toggle }.
- Hybrid: tuple
UseToggleReturnObject- Object form:
{ value: boolean; toggle: UseToggleFunction }.
- Object form:
UseToggleReturnTuple- Tuple form:
[value: boolean, toggle: UseToggleFunction].
- Tuple form: