Проверяет понимание условного вызова хуков и способов управления выполнением их логики без нарушения правил хуков.
В React действует строгое правило: хуки должны вызываться на каждом рендере в одном и том же порядке. Это связано с тем, что React хранит состояние хуков в виде связного списка, привязанного к порядку вызовов. Если хук вызывается только при определённом условии, порядок нарушается, и React не сможет корректно сопоставить состояние с конкретным хуком. Это приводит к ошибкам или непредсказуемому поведению.
Вместо того чтобы вызывать хук условно, его нужно вызывать всегда, но внутри самого хука обрабатывать условие. Например, можно передать в хук булевый флаг или объект с параметрами. Если условие не выполнено, хук может вернуть нейтральное значение (например, null или пустой объект) и не выполнять тяжёлую логику.
function useUserData(enabled) {
const [data, setData] = useState(null);
useEffect(() => {
if (!enabled) return; // ранний выход
fetch('/api/user').then(setData);
}, [enabled]);
return data;
}
function Profile({ role }) {
const isAdmin = role === 'admin';
const userData = useUserData(isAdmin); // хук вызывается всегда
// ...
}В этом примере хук вызывается на каждом рендере, но если флаг enabled ложный, эффект не выполняется, и состояние остаётся прежним. Это полностью соответствует правилам хуков.
Главный принцип — не нарушать порядок вызовов хуков. Управляйте логикой через аргументы хука или разбивайте компоненты так, чтобы условный рендеринг происходил на уровне компонентов, а не хуков. Это сохраняет предсказуемость и упрощает тестирование.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию