На картинке 3 кейса:
— Всегда указывайте все зависимости эффекта
— Если зависимость нестабильна (объект/функция) → мемоизируйте
(useMemo, useCallback)— Примитивы (строка, число) в deps — самый безопасный вариант
#hotfix #react
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤7👍2🔥2
  На картинке 3 ситуации:
— Никогда не спредьте всё подряд в корень
— Лишние атрибуты → лишние баги
— Чётко указывайте только то, что действительно нужно в DOM
#hotfix #react
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5👾2
  Многие используют эти псевдоклассы для управления состояниями форм и элементов, но есть ловушки:
1.
:focus-within реагирует только на фокус внутри самого элемента, не на внешние события.2.
:not() может «съесть» вложенные селекторы неправильно — порядок и специфичность важны.3. Если элемент содержит другие интерактивные элементы (кнопки, ссылки), браузер может вести себя по-разному.
— Использовать более точные селекторы и отдельные правила для состояния фокуса.
— Проверять вложенные элементы:
:focus-within смотрит любые потомки, не только input.— Не смешивать
:not() с сложными вложенными селекторами — часто проще добавить класс через JS.#hotfix #css
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤3👾2👍1🥱1
  Чтобы не теряться в потоке постов, мы собрали удобную навигацию по тегам. Всё нужное — в пару кликов:
#readme — код-сниппеты, CSS-трюки, JS one-liners, команды Git/CLI
#hotfix — реальные баги и проблемы с объяснением, как их исправить
#blueprint — high-level концепции и паттерны
#under_hood — разбираем, что происходит внутри фреймворков и браузера
#stack — обзоры библиотек, плагинов, инструментов
#release_digest — все важное за неделю/месяц в одном месте: новые версии фреймворков, релизы библиотек, ссылки и краткие описания
#code_challenge — интерактивные задачи с разбором на следующий день
#code_battle — столкновение технологий или подходов
#pixel_pause— мемы, юмор и забавные истории из фронтенд-жизни
#career_merge — советы по резюме, soft skills, вопросы с собеседований, обсуждение зарплат
#ux_review — изучаем интерфейсы и UX известных сайтов и приложений
#read_watch — подборки полезных материалов: статьи, конференции, GitHub, книги
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤4🔥1
  — Не создавайте функции прямо в JSX
— Используйте useCallback при передаче хендлеров в дочерние компоненты
— Особенно критично для списков и больших UI
#hotfix #react
Please open Telegram to view this post
    VIEW IN TELEGRAM
  🤔7👍5🔥3😁2❤1
  Иногда одна мелочь рушит весь интерфейс. Компонент внезапно сбрасывает состояние и анимации — а виноват всего один key. Раньше использовался
Math.random(), и React каждый раз считал, что элементы новые.В итоге он пересоздавал их с нуля — с потерей состояния и лагами.
Как решить проблему:
 item.id. Теперь React спокойно обновляет только то, что реально изменилось.#hotfix #react
Please open Telegram to view this post
    VIEW IN TELEGRAM
  😁10🥱8❤2👍2🤔1
  — Не злоупотребляйте reduce, если нужно просто накопить значения
— Для больших данных используйте явный цикл — он понятнее и быстрее
— Чистый код — это не в одну строку, а читаемый и оптимальный
#hotfix #js
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5❤2
  Кажется, что всё просто: список, onClick — готово. Но при сотнях элементов каждый ререндер создаёт новые функции в JSX.
React считает их изменёнными и перерисовывает даже те строки, что не менялись.
На демо — незаметно. На проде — больно.
Каждый ререндер создаёт новые колбэки → React считает пропы изменёнными → перерисовывает.
useCallback стабилизирует ссылку, и компонент больше не «дёргается» без причины.
— Если список огромный — рендерьте только видимую часть (react-window, react-virtualized).
— Если элемент сложный — выносите его в memo-компонент с передачей колбэка через пропсы.
#hotfix #react
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤5🥰2🔥1
  Казалось бы, простой условный рендеринг. Но вот вам сюрприз.
Когда
items пустой массив, items.length равен 0. В JavaScript 0 — это falsy значение, поэтому выражение 0 && <ul> вернет 0.React рендерит числа, поэтому на экране появится цифра
0!function ProductList({ items }) {
  return (
    <div>
      <h2>Товары</h2>
      {items.length > 0 && <ul>
        {items.map(item => <li key={item.id}>{item.name}</li>)}
      </ul>}
    </div>
  );
}Или еще лучше:
{!!items.length && <ul>...</ul>}Или тернарный оператор:
{items.length ? <ul>...</ul> : null}
Оператор && возвращает первое falsy значение или последнее truthy:
0 && <Component /> → вернет 0 (React рендерит!)
false && <Component /> → вернет false (React не рендерит)
true && <Component /> → вернет <Component />
React не рендерит: false, null, undefined, true
React рендерит: числа (0, 1, -1), строки, компоненты
#hotfix #react
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤5🥰2😁2
  Когда метод объекта передаётся как колбэк, он теряет контекст (см. фото). После клика в консоли будет undefined.
this зависит от способа вызова функции, а не от места, где она объявлена.
При передаче метода как ссылки (btn.handleClick) контекст теряется — this больше не указывает на объект.
1. Явно привязать контекст
button.addEventListener('click', btn.handleClick.bind(btn));
2. Использовать стрелочную функцию
button.addEventListener('click', () => btn.handleClick());
#hotfix #js
Please open Telegram to view this post
    VIEW IN TELEGRAM
  🥰4❤1👍1
  Кажется, простой счётчик — но React со своим batching (см. на картинке).
Ждём
React группирует (batch) обновления состояния внутри одного события. Обе строки читают старое значение count из замыкания, поэтому результат — 1.
Если новое состояние зависит от предыдущего — используйте функциональное обновление
setCount(prev => prev + 1);
setCount(prev => prev + 1);
Теперь результат будет 2.
React работает по снимкам состояния, а не по «живым» переменным — и именно это часто сбивает с толку.
#hotfix #react
Please open Telegram to view this post
    VIEW IN TELEGRAM
  🥰6👍1
  