Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: separation of concerns, presentational component, container component, table, business logic

Как разделить интерфейсный компонент и компонент с бизнес-логикой при работе с таблицами?

Вопрос проверяет понимание принципов разделения ответственности и слоев архитектуры при работе с табличными данными в UI.

Короткий ответ

Разделение достигается выделением презентационного компонента, отвечающего только за отрисовку таблицы, и контейнера, управляющего данными и логикой. Презентационный компонент получает данные через props и вызывает колбэки для действий. Контейнер подготавливает данные, обрабатывает события и передает их в презентационный компонент. Это упрощает тестирование и переиспользование.

Длинный ответ

Зачем разделять компоненты

При работе с таблицами часто возникает соблазн поместить всю логику — загрузку данных, сортировку, фильтрацию, пагинацию — прямо в компонент, который рендерит строки и ячейки. Это приводит к сильной связанности и усложняет тестирование, переиспользование и поддержку. Разделение на презентационный и контейнерный компоненты решает эту проблему.

Презентационный компонент

Он отвечает только за отображение таблицы. Он не знает, откуда берутся данные и как они обрабатываются. Он принимает данные через props и колбэки для действий (например, сортировка, клик по строке).

// Table.jsx
function Table({ data, columns, onSort, onRowClick }) {
  return (
    <table>
      <thead>
        <tr>
          {columns.map(col => (
            <th key={col.key} onClick={() => onSort(col.key)}>
              {col.label}
            </th>
          ))}
        </tr>
      </thead>
      <tbody>
        {data.map(row => (
          <tr key={row.id} onClick={() => onRowClick(row)}>
            {columns.map(col => (
              <td key={col.key}>{row[col.key]}</td>
            ))}
          </tr>
        ))}
      </tbody>
    </table>
  );
}

Контейнерный компонент

Он управляет состоянием и бизнес-логикой: загружает данные, обрабатывает сортировку, фильтрацию, пагинацию. Затем передает подготовленные данные и колбэки в презентационный компонент.

// TableContainer.jsx
function TableContainer() {
  const [data, setData] = useState([]);
  const [sortKey, setSortKey] = useState(null);

  useEffect(() => {
    fetch('/api/data')
      .then(res => res.json())
      .then(setData);
  }, []);

  const handleSort = (key) => {
    const sorted = [...data].sort((a, b) => a[key] > b[key] ? 1 : -1);
    setData(sorted);
    setSortKey(key);
  };

  return (
    <Table
      data={data}
      columns={[
        { key: 'name', label: 'Name' },
        { key: 'age', label: 'Age' }
      ]}
      onSort={handleSort}
      onRowClick={(row) => console.log(row)}
    />
  );
}

Вывод

Разделение на презентационный и контейнерный компоненты делает код более модульным, тестируемым и переиспользуемым. Презентационный компонент можно легко заменить или использовать в другом контексте, а контейнер — протестировать изолированно. Этот подход особенно полезен в больших проектах с множеством таблиц и сложной логикой работы с данными.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#separation of concerns

#presentational component

#container component

#table

#business logic

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию