Как useRef используется с useImperativeHandle
1️⃣ Как кратко ответить
useRef используется для создания референции, которая сохраняется между рендерами. useImperativeHandle позволяет компоненту управлять тем, что будет доступно через эту референцию, предоставляя контролируемый интерфейс для взаимодействия с компонентом извне.
2️⃣ Подробное объяснение темы
useRef и useImperativeHandle — это хуки в React, которые позволяют управлять референциями и предоставлять контролируемый интерфейс для взаимодействия с компонентами.
Зачем это нужно
-
useRef: Позволяет сохранять мутабельные значения, которые не вызывают повторный рендер компонента при изменении. Это полезно для доступа к DOM-элементам или хранения любых данных, которые должны сохраняться между рендерами. -
useImperativeHandle: Используется для настройки того, что будет доступно через референцию, когда компонент используется какforwardRef. Это позволяет компоненту предоставлять специфичный интерфейс для взаимодействия с ним извне, скрывая внутренние детали реализации.
Как это работает
Пример использования useRef и useImperativeHandle
import React, { useRef, useImperativeHandle, forwardRef } from 'react';
// Создаем функциональный компонент, который будет использовать forwardRef
const CustomInput = forwardRef((props, ref) => {
// Создаем локальную референцию для доступа к DOM-элементу input
const inputRef = useRef();
// Используем useImperativeHandle для настройки того, что будет доступно через ref
useImperativeHandle(ref, () => ({
// Метод для фокусировки на input
focus: () => {
inputRef.current.focus();
},
// Метод для получения значения input
getValue: () => {
return inputRef.current.value;
}
}));
// Возвращаем input элемент, связанный с локальной референцией
return <input ref={inputRef} {...props} />;
});
// Компонент, который использует CustomInput
function ParentComponent() {
// Создаем референцию, которая будет передана в CustomInput
const inputRef = useRef();
// Функция для фокусировки на input через референцию
const handleFocus = () => {
inputRef.current.focus();
};
// Функция для получения значения input через референцию
const handleGetValue = () => {
alert(inputRef.current.getValue());
};
// Рендерим CustomInput и кнопки для взаимодействия
return (
<div>
<CustomInput ref={inputRef} />
<button onClick={handleFocus}>Focus Input</button>
<button onClick={handleGetValue}>Get Input Value</button>
</div>
);
}
export default ParentComponent;
Объяснение кода
-
Импорт хуков и
forwardRef: Мы импортируем необходимые хуки и функциюforwardRefиз React.forwardRefпозволяет передавать референции дочерним компонентам. -
Создание компонента
CustomInput: Это функциональный компонент, который принимаетpropsиref. Мы используемforwardRefдля передачи референции. -
Локальная референция
inputRef: Создаем референцию с помощьюuseRef, чтобы получить доступ к DOM-элементуinput. -
useImperativeHandle: Настраиваем, что будет доступно через переданную референцию. В данном случае, это методыfocusиgetValue, которые позволяют фокусироваться наinputи получать его значение. -
Рендеринг
input: Возвращаем элементinput, связанный с локальной референциейinputRef. -
Компонент
ParentComponent: ИспользуетCustomInputи управляет его поведением через референциюinputRef. -
Функции
handleFocusиhandleGetValue: Эти функции вызывают методы, определенные вuseImperativeHandle, для взаимодействия сCustomInput.
Этот подход позволяет компоненту CustomInput предоставлять контролируемый интерфейс для взаимодействия, скрывая внутренние детали реализации и обеспечивая более чистую архитектуру.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться