Вопрос проверяет понимание принципов разделения ответственности и слоев архитектуры при работе с табличными данными в UI.
При работе с таблицами часто возникает соблазн поместить всю логику — загрузку данных, сортировку, фильтрацию, пагинацию — прямо в компонент, который рендерит строки и ячейки. Это приводит к сильной связанности и усложняет тестирование, переиспользование и поддержку. Разделение на презентационный и контейнерный компоненты решает эту проблему.
Он отвечает только за отображение таблицы. Он не знает, откуда берутся данные и как они обрабатываются. Он принимает данные через 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)}
/>
);
}Разделение на презентационный и контейнерный компоненты делает код более модульным, тестируемым и переиспользуемым. Презентационный компонент можно легко заменить или использовать в другом контексте, а контейнер — протестировать изолированно. Этот подход особенно полезен в больших проектах с множеством таблиц и сложной логикой работы с данными.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
React
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию