В React ref представляет собой механизм, позволяющий
напрямую получить доступ к DOM-элементу или экземпляру компонента. В
библиотеке Ant Design этот подход особенно полезен при
работе с интерактивными компонентами, требующими управления фокусом,
вызова методов или интеграции с внешними библиотеками.
В React ref создаётся с помощью функции
React.createRef() или хука useRef() для
функциональных компонентов.
import React, { useRef, useEffect } from 'react';
import { Input } from 'antd';
const Example = () => {
const inputRef = useRef(null);
useEffect(() => {
// Фокус на Input после рендера
inputRef.current.focus();
}, []);
return <Input ref={inputRef} placeholder="Введите текст" />;
};
export default Example;
Ключевые моменты:
useRef(null) создаёт объект с полем
current, который сохраняет ссылку на DOM-элемент.ref можно передавать компонентам Ant Design напрямую,
например Input, Button,
Select.useEffect гарантирует, что элемент уже
смонтирован и доступен для операций с DOM.Многие компоненты Ant Design предоставляют публичные методы для
управления состоянием компонента. С помощью ref можно
вызывать эти методы напрямую.
import React, { useRef } from 'react';
import { Button, Input } from 'antd';
const FocusExample = () => {
const inputRef = useRef(null);
const handleFocus = () => {
inputRef.current.focus(); // Вызов метода focus() компонента Input
};
return (
<div>
<Input ref={inputRef} placeholder="Введите текст" />
<Button type="primary" onCl ick={handleFocus}>
Установить фокус
</Button>
</div>
);
};
export default FocusExample;
Особенности:
focus(), blur(),
scrollTo() и т.д.ref.current ссылается на инстанс компонента Ant
Design, а не на чистый DOM-элемент, что важно учитывать при
вызове методов.Если компонент оборачивает Ant Design-компонент, чтобы получить
доступ к внутреннему элементу, необходимо использовать
forwardRef.
import React, { forwardRef } from 'react';
import { Input } from 'antd';
const CustomInput = forwardRef((props, ref) => {
return <Input {...props} ref={ref} />;
});
export default CustomInput;
Использование:
import React, { useRef } from 'react';
import { Button } from 'antd';
import CustomInput from './CustomInput';
const App = () => {
const inputRef = useRef(null);
const handleFocus = () => {
inputRef.current.focus();
};
return (
<div>
<CustomInput ref={inputRef} placeholder="Введите текст" />
<Button type="primary" onCl ick={handleFocus}>Фокус</Button>
</div>
);
};
Пояснения:
forwardRef передает ref от родителя к дочернему
компоненту.В некоторых случаях требуется не метод компонента, а непосредственный DOM-элемент, например для интеграции с библиотеками визуализации или анимации.
import React, { useRef, useEffect } from 'react';
import { Button } from 'antd';
const DomExample = () => {
const buttonRef = useRef(null);
useEffect(() => {
// Добавление кастомного обработчика событий напрямую на DOM
const btn = buttonRef.current;
btn.addEventListener('click', () => console.log('Нажата кнопка через DOM'));
return () => btn.removeEventListener('click', () => {});
}, []);
return <Button ref={buttonRef}>Кнопка</Button>;
};
Особенности работы:
ref. Например, компоненты обёртки могут возвращать объект с
методами.ref на <div>-обёртке или
inputRef (для Input) из API компонента.Ant Design Forms позволяют управлять полями через ref, что облегчает валидацию и сброс значений программно.
import React, { useRef } from 'react';
import { Form, Input, Button } from 'antd';
const FormExample = () => {
const formRef = useRef(null);
const handleReset = () => {
formRef.current.resetFields();
};
return (
<Form ref={formRef}>
<Form.Item name="username" label="Имя">
<Input />
</Form.Item>
<Button type="primary" onCl ick={handleReset}>Сбросить</Button>
</Form>
);
};
Ключевые моменты:
Form предоставляет методы resetFields(),
validateFields(), getFieldValue() через
ref.useState или Form API.Input и Button предоставляют методы через ref,
а обёртки вроде Modal могут возвращать объект с методами
управления модальным окном.forwardRef при создании кастомных
компонентов, чтобы сохранять доступ к внутреннему элементу или
методу.ref в сочетании с Ant Design открывает возможности
прямого управления компонентами и их DOM-элементами, сохраняя при этом
согласованность с реактивной моделью React. Он особенно эффективен для
фокуса, программного управления формами, вызова методов компонентов и
интеграции с внешними библиотеками, где декларативное управление не
применимо.