Создавал ли сложные компоненты с нуля

Ответ

Да, создавал. Например, разрабатывал кастомный селект с виртуальным скроллом для больших списков (10k+ элементов). Использовал React, TypeScript и библиотеку react-window для оптимизации рендеринга.

Пример:

import { FixedSizeList as List } from 'react-window';

const VirtualSelect = ({ options }) => {
  const Row = ({ index, style }) => (
    <div style={style}>{options[index].label}</div>
  );

  return (
    <List
      height={300}
      itemCount={options.length}
      itemSize={35}
      width={300}
    >
      {Row}
    </List>
  );
};

Также реализовывал:

  • Drag-and-drop таблицы с сортировкой и кастомными ячейками.
  • Модальные окна с управлением через Context API.
  • Динамические формы с валидацией (Formik + Yup).

Учитывал доступность (a11y), производительность и переиспользуемость.

Ответ 18+ 🔞

А, ну да, создавал, блядь! Ну как же, ёпта, без этого никуда. Вот, например, был случай — нужно было запилить кастомный селект, но такой, чтобы не сдох, когда в него суёшь список размером с телефонную книгу Москвы, тысяч так десять пунктов. Обычный селект браузера просто бы взвыл и лёг, а мне надо, чтобы всё летало.

Взял React, TypeScript, чтобы не выстрелить себе в ногу, и библиотечку react-window — она как раз для таких цирков, рендерит только то, что видно, а не всю хуйню сразу. Гениально же, да?

Вот, смотри, кусочек кода, как я это делал:

import { FixedSizeList as List } from 'react-window';

const VirtualSelect = ({ options }) => {
  const Row = ({ index, style }) => (
    <div style={style}>{options[index].label}</div>
  );

  return (
    <List
      height={300}
      itemCount={options.length}
      itemSize={35}
      width={300}
    >
      {Row}
    </List>
  );
};

Выглядит просто, а пиздец как эффективно работает. Пользователь скроллит, а под капотом только нужные элементы рендерятся. Магия, сука!

А ещё были, например, таблицы с перетаскиванием строк — drag-and-drop, блядь, чтобы их можно было мышкой таскать, как мешки с картошкой, и сразу сортировались. С кастомными ячейками, где можно было чё угодно впихнуть: иконки, прогресс-бары, хуй в пальто.

Модалки делал, которые через один общий Context управляются, чтобы не плодить эту дичь в каждом компоненте. Нажал кнопку — окно вылезло, нажал на крестик или на затемнение — схлопнулось. Красота!

Ну и, само собой, формы динамические, где поля могут добавляться, удаляться, валидация на лету. Использовал Formik с Yup — связка просто охуенная, вся логика состояния и проверок не в коде раскидана, а аккуратно описана.

И во всём этом, понимаешь, главное было не только чтобы работало, но и чтобы доступно было для скринридеров, производительно, и чтобы потом другой разработчик, глядя на этот код, не матерился, а мог переиспользовать куски. А то иногда такое напишешь — сам через месяц разбираться боишься, волнение ебать!