apps/mantine.dev/src/pages/hooks/use-uncontrolled.mdx
import { Layout } from '@/layout'; import { MDX_DATA } from '@/mdx';
export default Layout(MDX_DATA.useUncontrolled);
The use-uncontrolled hook manages state for both controlled and uncontrolled components:
import { useUncontrolled } from '@mantine/hooks';
interface CustomInputProps {
value?: string;
defaultValue?: string;
onChange?: (value: string) => void;
}
function CustomInput({
value,
defaultValue,
onChange,
}: CustomInputProps) {
const [_value, handleChange] = useUncontrolled({
value,
defaultValue,
finalValue: 'Final',
onChange,
});
return (
<input
type="text"
value={_value}
onChange={(event) => handleChange(event.currentTarget.value)}
/>
);
}
By default, the hook will set the type automatically, but you can provide your own type:
import { useUncontrolled } from '@mantine/hooks';
function Demo() {
const [_value, handleChange] = useUncontrolled<number>({
value: 10,
defaultValue: 5,
finalValue: 20,
onChange: (val) => console.log(val > 10),
});
}
interface UseUncontrolledOptions<T> {
/** Value for controlled state */
value?: T;
/** Initial value for uncontrolled state */
defaultValue?: T;
/** Final value for uncontrolled state when value and defaultValue are not provided */
finalValue?: T;
/** Controlled state onChange handler */
onChange?: (value: T, ...payload: any[]) => void;
}
type UseUncontrolledReturnValue<T> = [
/** Current value */
T,
/** Handler to update the state, passes `value` and `payload` to `onChange` */
(value: T, ...payload: any[]) => void,
/** True if the state is controlled; false if uncontrolled */
boolean,
];
function useUncontrolled<T>(input: UseUncontrolledOptions<T>): UseUncontrolledReturnValue<T>;
The UseUncontrolledOptions and UseUncontrolledReturnValue types are exported from @mantine/hooks;
import type { UseUncontrolledOptions, UseUncontrolledReturnValue } from '@mantine/hooks';