В Ant Design зависимые поля (dependent fields) — это элементы формы, значение которых изменяется в зависимости от состояния или значения других полей. Такая логика особенно полезна при создании динамических форм, где пользовательский ввод на одном шаге влияет на доступные варианты или поведение других элементов.
В библиотеке Ant Design ключевым инструментом для реализации зависимых полей является компонент Form совместно с методами Form.Item и Form.useForm.
Form.useFormДля управления зависимостями полей необходимо создать экземпляр формы:
import { Form, Input, Select, Button } from 'antd';
const [form] = Form.useForm();
Экземпляр form позволяет получать значения полей,
устанавливать их и подписываться на изменения через методы:
form.getFieldValue(fieldName) — получение текущего
значения поля.form.setFieldsValue({ fieldName: value }) — установка
значения поля.form.validateFields() — проверка валидности всех или
указанных полей.form.watch — (новый в AntD 5) позволяет подписаться на
изменения значений.dependenciesВ Ant Design 4 и выше компонент Form.Item
поддерживает свойство dependencies, которое позволяет
указать, от каких полей зависит текущий:
<Form.Item
label="Подкатегория"
name="subcategory"
dependencies={['category']}
rules={[{ required: true, message: 'Выберите подкатегорию' }]}
>
{({ getFieldValue }) => {
const category = getFieldValue('category');
const options = category === 'fruits'
? ['Яблоко', 'Банан']
: category === 'vegetables'
? ['Морковь', 'Брокколи']
: [];
return <Select options={options.map(opt => ({ label: opt, value: opt }))} />;
}}
</Form.Item>
Ключевые моменты:
dependencies — массив имен полей, изменения которых
вызывают перерендер текущего Form.Item.getFieldValue, что позволяет динамически вычислять
доступные значения.Иногда необходимо не только менять содержимое поля, но и его видимость:
<Form.Item label="Использовать дополнительные опции" name="enableOptions" valuePropName="checked">
<Switch />
</Form.Item>
<Form.Item noStyle shouldUpdate={(prevValues, currentValues) => prevValues.enableOptions !== currentValues.enableOptions}>
{({ getFieldValue }) => getFieldValue('enableOptions') && (
<Form.Item label="Дополнительные настройки" name="extraSettings">
<Input placeholder="Введите настройки" />
</Form.Item>
)}
</Form.Item>
Особенности:
shouldUpdate позволяет вручную контролировать, когда
Form.Item должен перерендериться.noStyle убирает визуальное оформление контейнера, чтобы
не нарушать верстку.Для зависимых полей критично правильно настроить валидацию. Ant
Design предоставляет возможность использовать функцию
validator для динамических правил:
<Form.Item
label="Пароль"
name="password"
rules={[{ required: true, message: 'Введите пароль' }]}
>
<Input.Password />
</Form.Item>
<Form.Item
label="Подтверждение пароля"
name="confirm"
dependencies={['password']}
rules={[
{ required: true, message: 'Подтвердите пароль' },
({ getFieldValue }) => ({
validator(_, value) {
if (!value || getFieldValue('password') === value) {
return Promise.resolve();
}
return Promise.reject(new Error('Пароли не совпадают'));
},
}),
]}
>
<Input.Password />
</Form.Item>
Выводы по валидации:
dependencies гарантирует, что при изменении основного
поля зависимое поле также проверяется заново.validator позволяет реализовать условные
правила, которые зависят от других полей.shouldUpdate для сложной логики
видимости вместо dependencies, если условие
зависит сразу от нескольких полей.form.setFieldsValue({ fieldName: undefined }).getFieldValue.В типичной динамической форме с зависимостями присутствуют три уровня:
dependencies, shouldUpdate, функции в children
и кастомные валидаторы.Такой подход обеспечивает реактивность форм и позволяет создавать гибкие интерфейсы с минимальным количеством ручного кода.