Managing controlled / uncontrolled values can be tedious, and maintaining the duplication between stateful and stateless components can be exhausting. `use-controlled-state abstracts` this pain away [into a simple hook](src/index.tsx).
npm install use-controlled-stateManaging controlled / uncontrolled values can be tedious, and maintaining the duplication between stateful and stateless components can be exhausting. use-controlled-state abstracts this pain away into a simple hook.
Consider a component. In most cases you just want a simple collapsible where you don't have to think about managing state where you use the component
``jsx`
I'm now visible!
As requirements evolve, the parent component might have to decide when the Collapsible component opens and closes.
You'd have to move state up to a higher component To be able to use it:
`jsx`
<>
onChange={() => setState(prevIsOpen => !prevIsOpen)}
/>
Collapsible is open? {${isOpen}}
>
Common solutions you see for this pattern involve calling the onChange/setState prop in component lifecyles to keep the state in sync. This hook abstracts away the pains of supporting both APIs
`tsx
import { useControlledState } from 'use-controlled-state';
interface Props {
onChange?: (isOpen: boolean) => void;
title: string;
isOpen?: boolean;
children: React.ReactNode;
}
function Collapsible({ onChange, isOpen, title, children }: Props) {
const [isOpenState, setState] = useControlledState(value, onChange);
return (
<>
{isOpen && children}
>
);
}
`
Now you can use the component with a controlled and uncontrolled API
`jsx``