⚛️ React: избавляемся от вложенных условий в JSX
Глубокие тернарные операторы быстро превращают JSX в нечитаемый код. Более понятный подход — ранние возвраты и предсказуемая структура рендера.
⚠️ Важное правило Hooks
Все хуки должны вызываться на верхнем уровне компонента — до любых return и условных конструкций.
React требует, чтобы хуки выполнялись в одном и том же порядке при каждом рендере. Если порядок или количество хуков изменится, возникнет ошибка.
Ранние возвраты полностью безопасны, если хуки вызываются до любых условий.
✅ Альтернатива: объектный маппинг
Подходит для компонентов с большим количеством состояний:
Важно: храните компоненты, а не JSX-элементы, чтобы свободно передавать пропсы.
➡️ Когда что использовать:
⚪️ Early Returns — оптимальны в большинстве случаев (loading / error / success).
⚪️ Объектный маппинг — подходит, когда состояний много и они определяются строковым статусом: этапы процессов, статусы заказов, типы уведомлений, шаги визардов.
💡 Начинайте с early returns — это самый простой и понятный вариант. Переходите на маппинг только тогда, когда это действительно упрощает код.
🐸 Библиотека фронтендера
#hotfix #react
Глубокие тернарные операторы быстро превращают JSX в нечитаемый код. Более понятный подход — ранние возвраты и предсказуемая структура рендера.
⚠️ Важное правило Hooks
Все хуки должны вызываться на верхнем уровне компонента — до любых return и условных конструкций.
React требует, чтобы хуки выполнялись в одном и том же порядке при каждом рендере. Если порядок или количество хуков изменится, возникнет ошибка.
// Ошибка: хук после return
function Component({ data }) {
if (!data) return null;
const [value] = useState(data); // Хук вызван условно!
}
// Правильно: хуки перед return
function Component({ data }) {
const [value] = useState(data);
if (!data) return null;
}
Ранние возвраты полностью безопасны, если хуки вызываются до любых условий.
Подходит для компонентов с большим количеством состояний:
const STATE_COMPONENTS = {
loading: Spinner,
error: Error,
success: Content,
empty: Empty
};
function DataView({ status, ...props }) {
const Component = STATE_COMPONENTS[status];
return Component ? <Component {...props} /> : null;
}
Важно: храните компоненты, а не JSX-элементы, чтобы свободно передавать пропсы.
#hotfix #react
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🥰3
Когда нужен простой и предсказуемый центр по обеим осям — Grid справляется быстрее и чище, чем Flex.
• модальные окна
• лоадеры и спиннеры
• empty states
• hero-блоки
• карточки с иконками и коротким текстом
Любой статичный компонент, где центр — ключевая точка внимания.
place-items — это шорткат для align-items + justify-items.
Можно настраивать оси раздельно:
.container {
display: grid;
place-items: start center; /* вертикаль | горизонталь */
}
Flex выигрывает в динамических сценариях:
• несколько элементов в строке
• space-between / space-around
• адаптивный wrap
• навигация, списки, карточки в ряду
Если нужно распределить несколько элементов, а не центрировать один — выбирайте Flex.
🌐 Поддержка: Chrome 59+, Firefox 45+, Safari 11+, Edge 79+
#hotfix #css
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🥰2
Никаких больше “Cannot read property of undefined”!
// Опасно
const city = user.address.city;
// Ошибка, если address === undefined
// Многословно
const city = user && user.address && user.address.city;
// Безопасно и элегантно
const city = user?.address?.city ?? 'Не указан’;
Возвращает undefined, если слева null или undefined, и не пытается читать свойство дальше.
Возвращает правую часть только если слева null или undefined.
const volume = settings.volume ?? 0.5;
// Если volume = 0, вернёт 0 — корректно
const volume = settings.volume || 0.5;
// Если volume = 0, вернёт 0.5 — нежелательное поведение
— ответы API
— вложенные объекты конфигурации
— поля форм, которые могут отсутствовать
— опциональные коллбэки
// Массивы
const first = users?.[0]?.name ?? 'Гость';
// Функции
onClick?.();
// Сложные цепочки
const price = product?.variants?.[0]?.price?.amount ?? 0;
#hotfix #ts
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6❤5
Сетевые ошибки случаются постоянно. Простое решение на 15 строк:
— Автоматический retry при временных ошибках
— Экспоненциальная задержка (1s → 2s → 4s)
— Не retry'ит клиентские ошибки (400, 401, 403, 404)
— Retry только для: 408, 429, 500, 502, 503, 504
Пример использования:
try {
const res = await fetchWithRetry('/api/data');
const data = await res.json();
console.log(data);
} catch (err) {
console.error('Все попытки неудачны:', err);
}
⚠️ fetch НЕ отклоняет промис на HTTP ошибках — нужна проверка
response.ok— GET/PUT/DELETE запросы
— Загрузка конфигурации
— Webhook'и
— POST без идемпотентности
— Операции с оплатой
#hotfix
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2🥰2
⚛️ React: правильный useEffect с setInterval
Типичная ошибка — класть состояние в зависимости эффекта, который сам его обновляет.
❌ Плохо
count в зависимостях → useEffect пересоздаёт setInterval каждую секунду.
✅ Правильно
Функциональное обновление → интервал создаётся один раз, состояние всегда актуально.
Правило из документации:
📍 Навигация: [Вакансии]
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
🐸 Библиотека фронтендера
#hotfix #react
Типичная ошибка — класть состояние в зависимости эффекта, который сам его обновляет.
count в зависимостях → useEffect пересоздаёт setInterval каждую секунду.
Функциональное обновление → интервал создаётся один раз, состояние всегда актуально.
Правило из документации:
Если новое состояние зависит от предыдущего — используйте функциональное обновление.
useEffect не должен перезапускаться из-за собственного setState.
#hotfix #react
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🥰2