В библиотеке Ant Design управление условной видимостью полей формы реализуется с помощью компонентов Form и Form.Item, в сочетании с React state или методами самого компонента Form. Это позволяет динамически отображать или скрывать поля в зависимости от значений других полей, состояния формы или внешних данных.
dependencies для реактивной видимостиКомпонент Form.Item поддерживает свойство
dependencies, которое позволяет отслеживать изменения
значений других полей и реагировать на них.
Пример:
import { Form, Input, Sel ect } from 'antd';
const { Option } = Select;
<Form>
<Form.Item name="type" label="Тип">
<Select>
<Option value="person">Физическое лицо</Option>
<Option value="company">Компания</Option>
</Select>
</Form.Item>
<Form.Item
noStyle
shouldUpdate={(prevValues, currentValues) => prevValues.type !== currentValues.type}
>
{({ getFieldValue }) => {
return getFieldValue('type') === 'company' ? (
<Form.Item name="companyName" label="Название компании" rules={[{ required: true }]}>
<Input />
</Form.Item>
) : null;
}}
</Form.Item>
</Form>
Ключевые моменты:
noStyle убирает лишние обертки, чтобы не ломать
верстку.shouldUpdate позволяет оптимизировать ререндер и
отслеживать только необходимые изменения.null.Можно управлять видимостью полей через локальный state React, особенно когда условие зависит от внешних данных или асинхронных операций:
import { Form, Input, Checkbox } fr om 'antd';
import { useState } from 'react';
function DynamicForm() {
const [showExtra, setShowExtra] = useState(false);
return (
<Form>
<Form.Item name="hasExtra" valuePropName="checked">
<Checkbox onCha nge={e => setShowExtra(e.target.checked)}>
Добавить дополнительные данные
</Checkbox>
</Form.Item>
{showExtra && (
<Form.Item name="extraField" label="Дополнительно">
<Input />
</Form.Item>
)}
</Form>
);
}
Особенности подхода:
showExtra полностью управляет
отображением поля.true, что улучшает
производительность и предотвращает ненужные валидации.hidden
для скрытия поляAnt Design версии 4.20+ добавил возможность
использовать свойство hidden на Form.Item.
Оно сохраняет поле в структуре формы, но не отображает его на UI. Это
полезно, если требуется сохранить значение для дальнейшей обработки:
<Form.Item name="secretField" label="Секретное поле" hidden={!showSecret}>
<Input />
</Form.Item>
Преимущества hidden:
getFieldsValue,
validateFields), даже если скрыто.Form.List с условной логикойДля динамических массивов полей (Form.List) можно
комбинировать условную видимость:
<Form.List name="items">
{(fields, { add, remove }) => (
<>
{fields.map(field => (
<Form.Item
{...field}
key={field.key}
hidden={field.name % 2 === 0} // скрываем каждое второе поле
>
<Input placeholder="Введите значение" />
</Form.Item>
))}
<Form.Item>
<Button type="dashed" onCl ick={() => add()}>Добавить</Button>
</Form.Item>
</>
)}
</Form.List>
Особенности:
hidden.Минимизировать ререндеры Использовать
shouldUpdate или мемоизацию (React.memo) для
тяжелых форм.
Хранить значения скрытых полей Если поле должно
быть скрыто, но данные сохраняются, лучше использовать
hidden, а не полностью удалять поле из JSX.
Смешанные подходы В сложных формах можно
комбинировать dependencies, состояние и
hidden, чтобы управлять различными сценариями
видимости.
Валидация скрытых полей Поля с
hidden по умолчанию участвуют в валидации, если это не
требуется, можно использовать rules: [] или
Form.Item с shouldUpdate для условного
применения правил.
Условная видимость полей в Ant Design обеспечивает гибкость для построения интерактивных форм с динамическими зависимостями. Выбор подхода зависит от того, требуется ли сохранять скрытые значения, оптимизировать ререндер или управлять сложной логикой форм.