useId — это хук в React, который генерирует уникальные ID, стабильные между сервером и клиентом. Он предназначен для создания доступных HTML-атрибутов, таких как id и aria-*, которые должны совпадать между серверным и клиентским рендерингом.
Синтаксис: const id = useId();
Ключевые особенности:
Пример использования:
function AccessibleComponent() {
const id = useId();
return (
<div>
<label htmlFor={id}>Имя:</label>
<input id={id} type="text" />
</div>
);
}Хук useId — один из встроенных хуков React, предназначенный для генерации уникальных ID, которые остаются согласованными между серверным рендерингом (SSR) и клиентским рендерингом (CSR). Он решает распространенные проблемы доступности, возникающие, когда HTML-атрибуты, такие как id, не совпадают между серверным и клиентским контентом. 🚀
useId генерирует уникальную строку ID, которая:
import React, { useId } from 'react';
function Component() {
const id = useId();
return (
<div>
<label htmlFor={id}>Метка ввода</label>
<input id={id} type="text" />
</div>
);
}Когда компонент рендерится:
function AccessibleForm() {
const nameId = useId();
const emailId = useId();
return (
<form>
<label htmlFor={nameId}>Полное имя:</label>
<input id={nameId} type="text" name="name" />
<label htmlFor={emailId}>Email:</label>
<input id={emailId} type="email" name="email" />
</form>
);
}function Accordion() {
const accordionId = useId();
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<button
aria-expanded={isOpen}
aria-controls={`${accordionId}-content`}
onClick={() => setIsOpen(!isOpen)}
>
Переключить аккордеон
</button>
<div
id={`${accordionId}-content`}
aria-hidden={!isOpen}
>
Содержимое аккордеона
</div>
</div>
);
}function Modal({ isOpen, onClose, children }) {
const modalId = useId();
const titleId = useId();
if (!isOpen) return null;
return (
<div
role="dialog"
aria-labelledby={titleId}
aria-describedby={modalId}
>
<h2 id={titleId}>Заголовок модального окна</h2>
<div id={modalId}>{children}</div>
<button onClick={onClose}>Закрыть</button>
</div>
);
}✅ Используйте useId когда:
function AccessibleComponent() {
const id = useId();
return (
<div>
<label htmlFor={id}>Описание:</label>
<textarea id={id} name="description" />
</div>
);
}❌ Избегайте useId когда:
// ❌ Не стоит использовать useId без необходимости
function SimpleComponent() {
const id = useId(); // Не нужен для простой стилизации
return <div id={id} className="simple-div">Контент</div>;
}
// ✅ Просто используйте статические ID
function SimpleComponent() {
return <div id="simple-div" className="simple-div">Контент</div>;
}// ❌ Неправильное использование для общих уникальных ID
function Component() {
const uniqueId = useId();
return (
<div data-id={uniqueId}>
{/* Использование ID для отслеживания данных вместо доступности */}
</div>
);
}
// ✅ Используйте по назначению для доступности
function Component() {
const id = useId();
return (
<div>
<label htmlFor={id}>Ввод:</label>
<input id={id} type="text" />
</div>
);
}// ❌ Ошибка: условный вызов хука
function Component({ showLabel }) {
let id;
if (showLabel) {
id = useId(); // Хук вызывается условно!
}
return <div>{showLabel && <label htmlFor={id}>Метка</label>}</div>;
}
// ✅ Правильно: всегда вызывайте хук
function Component({ showLabel }) {
const id = useId(); // Всегда вызывается
return (
<div>
{showLabel && <label htmlFor={id}>Метка</label>}
<input id={id} type="text" />
</div>
);
}// ❌ Ошибка: одинаковый ID для нескольких элементов
function ListComponent({ items }) {
const id = useId();
return (
<div>
{items.map((item, index) => (
<div key={index}>
<label htmlFor={id}>Элемент {index}:</label>
<input id={id} type="text" /> {/* Одинаковый ID для всех полей ввода! */}
</div>
))}
</div>
);
}
// ✅ Правильно: каждый элемент получает свой ID
function ListComponent({ items }) {
return (
<div>
{items.map((item, index) => (
<ItemComponent key={index} item={item} index={index} />
))}
</div>
);
}
function ItemComponent({ item, index }) {
const id = useId();
return (
<div>
<label htmlFor={id}>Элемент {index}:</label>
<input id={id} type="text" />
</div>
);
}✅ useId — это хук React для:
✅ Когда использовать:
❌ Когда избегать:
✅ Лучшие практики:
useId — это специализированный хук для сценариев доступности, особенно важный в приложениях с серверным рендерингом. Используйте его, когда вам нужно обеспечить согласованные ID между сервером и клиентом для правильной доступности. 🚀
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪