В современных веб-приложениях на React синхронизация состояния
пользовательского интерфейса с централизованным хранилищем данных
(store) играет ключевую роль. Ant Design предоставляет широкий набор
компонентов, которые можно эффективно интегрировать с состоянием через
useState, useReducer, Context API
или сторонние библиотеки управления состоянием, такие как
Redux или MobX.
Односторонний поток данных Все компоненты Ant
Design получают значения через пропсы и отправляют изменения через
обработчики событий (onChange, onSelect,
onClick). Это обеспечивает предсказуемость поведения
интерфейса.
import { Input } from 'antd';
import { useState } from 'react';
const Example = () => {
const [value, setValue] = useState('');
return (
<Input
value={value}
onCha nge={(e) => setValue(e.target.value)}
placeholder="Введите текст"
/>
);
};
В этом примере Input полностью управляется локальным
состоянием value. Любые изменения текста сразу отражаются в
состоянии, что упрощает синхронизацию с глобальным store.
Связывание с Redux или Context Для крупных приложений локальное состояние компонентов часто недостаточно. Используется централизованное хранилище. Например, с Redux:
import { Input } from 'antd';
import { useDispatch, useSelector } from 'react-redux';
import { setUsername } from './store/userSlice';
const UsernameInput = () => {
const dispatch = useDispatch();
const username = useSelector(state => state.user.name);
return (
<Input
value={username}
onCha nge={(e) => dispatch(setUsername(e.target.value))}
placeholder="Имя пользователя"
/>
);
};
Здесь состояние username хранится в глобальном store,
что позволяет другим компонентам автоматически получать актуальные
данные.
Ant Design предоставляет компонент Form, который
оптимизирует синхронизацию формы с состоянием:
Form.Item и контролируемые компоненты Каждый
элемент формы может быть полностью управляемым через Form и
его методы: getFieldValue, setFieldsValue,
validateFields.
import { Form, Input, Button } from 'antd';
const DemoForm = () => {
const [form] = Form.useForm();
const handleSubmit = () => {
const values = form.getFieldsValue();
console.log(values);
};
return (
<Form form={form}>
<Form.Item name="email" rules={[{ required: true, message: 'Введите email' }]}>
<Input placeholder="Email" />
</Form.Item>
<Button type="primary" onCl ick={handleSubmit}>Отправить</Button>
</Form>
);
};
Ключевые моменты:
Form.Item связывается с конкретным полем через
name.rules задают валидацию на уровне формы.form.getFieldsValue() позволяет получить текущее
состояние всех полей.Синхронизация с глобальным store Можно напрямую
синхронизировать Form с Redux:
import { useSelector, useDispatch } from 'react-redux';
import { Form, Input } from 'antd';
import { setProfile } from './store/profileSlice';
const ProfileForm = () => {
const dispatch = useDispatch();
const profile = useSelector(state => state.profile);
const [form] = Form.useForm();
form.setFieldsValue(profile);
const onValuesCha nge = (changedValues) => {
dispatch(setProfile(changedValues));
};
return (
<Form form={form} onValuesCha nge={onValuesChange}>
<Form.Item name="firstName">
<Input placeholder="Имя" />
</Form.Item>
<Form.Item name="lastName">
<Input placeholder="Фамилия" />
</Form.Item>
</Form>
);
};
Таким образом, любое изменение в форме мгновенно обновляет store, а
любые изменения store (например, после загрузки данных с сервера)
автоматически отображаются в форме через
form.setFieldsValue.
Некоторые компоненты Ant Design, такие как Select,
DatePicker, Switch, имеют собственное
внутреннее состояние, которое можно контролировать через пропсы:
Select
import { Sel ect } from 'antd';
import { useState } fr om 'react';
const { Option } = Select;
const DemoSelect = () => {
const [value, setValue] = useState('one');
return (
<Sel ect value={value} onCha nge={setValue}>
<Option value="one">Один</Option>
<Option value="two">Два</Option>
</Select>
);
};DatePicker
import { DatePicker } fr om 'antd';
import { useState } from 'react';
import dayjs from 'dayjs';
const DemoDate = () => {
const [date, setDate] = useState(dayjs());
return (
<DatePicker value={date} onCha nge={(d) => setDate(d)} />
);
};Контролируемое использование этих компонентов гарантирует синхронизацию с store или локальным состоянием.
lodash.debounce или аналогичные
методы, чтобы не перегружать store частыми обновлениями.Table), лучше оборачивать в
React.memo и использовать useCallback для
обработчиков.reselect), чтобы изменения в несвязанных частях состояния
не приводили к перерендеру всего интерфейса.Компонент Table требует особого внимания при
синхронизации с store:
import { Table } from 'antd';
import { useSelector, useDispatch } from 'react-redux';
import { updateRows } from './store/tableSlice';
const DemoTable = () => {
const dispatch = useDispatch();
const rows = useSelector(state => state.table.rows);
const handleEdit = (id, key, value) => {
const updated = rows.map(row => row.id === id ? { ...row, [key]: value } : row);
dispatch(updateRows(updated));
};
const columns = [
{
title: 'Имя',
dataIndex: 'name',
render: (text, record) => (
<input
value={text}
onCha nge={(e) => handleEdit(record.id, 'name', e.target.value)}
/>
)
},
{
title: 'Возраст',
dataIndex: 'age',
render: (text, record) => (
<input
value={text}
type="number"
onCha nge={(e) => handleEdit(record.id, 'age', e.target.value)}
/>
)
}
];
return <Table dataSource={rows} columns={columns} rowKey="id" />;
};
Особенности синхронизации Table:
rowKey гарантирует корректное
сопоставление строк при перерендере.value +
onChange) для точного отражения состояния.Form с
onValuesChange для двусторонней синхронизации.Table, Tree,
Upload) заранее продумывать стратегию синхронизации с
store.Эти принципы обеспечивают стабильную, предсказуемую и масштабируемую синхронизацию интерфейса и состояния в приложениях на Ant Design.