В библиотеке Chakra UI компоненты можно использовать как управляемые (controlled), так и неуправляемые (uncontrolled). Понимание различий между этими подходами критически важно для построения интерфейсов, где требуется гибкость в управлении состоянием и реактивность компонентов.
Неуправляемые компоненты сами контролируют своё внутреннее состояние. Это означает, что значение поля ввода или состояния компонента хранится внутри самого компонента, и разработчик не обязан напрямую следить за этим состоянием. Такой подход часто удобен для простых форм или компонентов с локальной логикой.
Пример: Input
import { Input } from "@chakra-ui/react";
function UncontrolledInput() {
return <Input placeholder="Введите текст" />;
}
Здесь <Input /> хранит своё значение
самостоятельно. Можно получить текущее значение через ref,
но это не обязательно для базового использования.
Особенности неуправляемых компонентов:
ref или событие
onChange при необходимости.import { useRef } from "react";
import { Input, Button } from "@chakra-ui/react";
function UncontrolledForm() {
const inputRef = useRef();
const handleSubmit = () => {
alert(`Введено: ${inputRef.current.value}`);
};
return (
<>
<Input ref={inputRef} placeholder="Введите текст" />
<Button onCl ick={handleSubmit}>Отправить</Button>
</>
);
}
Управляемые компоненты полностью контролируются состоянием React. Все изменения значения происходят через пропсы и обработчики событий. Такой подход позволяет синхронизировать состояние компонентов с другими частями приложения и реализовывать сложные логики валидации или реакции на изменения.
Пример: Input с управлением
import { useState } from "react";
import { Input } from "@chakra-ui/react";
function ControlledInput() {
const [value, setValue] = useState("");
const handleChange = (event) => {
setValue(event.target.value);
};
return <Input value={value} onCha nge={handleChange} placeholder="Введите текст" />;
}
Особенности управляемых компонентов:
Большинство компонентов Chakra UI поддерживают оба подхода. Ключевые моменты для использования:
Input, Textarea, Select
value и
onChange.defaultValue или
ref.Checkbox и Radio
isChecked + onChange.defaultIsChecked.import { Checkbox } from "@chakra-ui/react";
import { useState } from "react";
function CheckboxExample() {
const [checked, setChecked] = useState(false);
return (
<Checkbox isChecked={checked} onCha nge={(e) => setChecked(e.target.checked)}>
Согласен с условиями
</Checkbox>
);
}
Switch и Slider
isChecked/value, неуправляемый через
defaultIsChecked/defaultValue.| Тип компонента | Преимущества | Ограничения |
|---|---|---|
| Неуправляемый (uncontrolled) | Легкая интеграция, меньше кода, быстрый старт | Сложнее синхронизировать с глобальным состоянием |
| Управляемый (controlled) | Полная синхронизация, легко реализовать логику и валидацию | Требует больше кода, состояние должно быть определено заранее |
Chakra UI легко интегрируется с библиотеками форм, такими как React Hook Form или Formik. Управляемые компоненты лучше подходят для этих библиотек, так как они ожидают контроль состояния через пропсы.
Пример с React Hook Form:
import { useForm } from "react-hook-form";
import { Input, Button } from "@chakra-ui/react";
function FormWithHook() {
const { register, handleSubmit } = useForm();
const onSub mit = (data) => {
console.log(data);
};
return (
<form onSub mit={handleSubmit(onSubmit)}>
<Input {...register("username")} placeholder="Имя пользователя" />
<Button type="submit">Отправить</Button>
</form>
);
}
Здесь <Input /> управляется библиотекой, и его
состояние синхронизировано через React Hook Form.
defaultValue/defaultIsChecked для
неуправляемых компонентов.value/isChecked +
onChange для управляемых компонентов.Этот подход обеспечивает гибкость интерфейсов в Chakra UI и позволяет масштабировать проекты, поддерживая чистую архитектуру компонентов.