Этот вопрос проверяет понимание принципа единственной ответственности (SRP) при проектировании React-компонентов и его влияние на читаемость, тестируемость и поддержку кода.
Принцип единственной ответственности (Single Responsibility Principle, SRP) — один из ключевых принципов SOLID, который гласит, что модуль (в контексте React — компонент, хук или функция) должен иметь одну и только одну причину для изменения. В React это означает проектирование компонентов, которые отвечают за одну четкую часть пользовательского интерфейса или логики.
Вместо создания крупного компонента, который и отображает данные, и обрабатывает события, и управляет состоянием, следует разбить его на несколько мелких:
UserList, который просто мапит массив пользователей в список элементов.UserListContainer, который загружает данные с API и передает их в UserList.Рассмотрим компонент, который нарушает SRP, так как совмещает загрузку данных, их отображение и обработку кликов:
// ПЛОХО: Компонент с множеством ответственностей
function BadUserComponent() {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
setLoading(true);
fetch('/api/users')
.then(res => res.json())
.then(data => {
setUsers(data);
setLoading(false);
});
}, []);
const handleDelete = (id) => {
// Логика удаления...
};
if (loading) return Loading...;
return (
User List
{users.map(user => (
{user.name}
handleDelete(user.id)}>Delete
))}
);
}Теперь разделим ответственности, используя кастомный хук для логики данных и выделив компонент представления:
// Хук для управления данными пользователей (одна ответственность)
function useUsers() {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
setLoading(true);
fetch('/api/users')
.then(res => res.json())
.then(data => {
setUsers(data);
setLoading(false);
});
}, []);
const deleteUser = (id) => {
// Логика удаления...
};
return { users, loading, deleteUser };
}
// Компонент представления для списка (одна ответственность — рендеринг)
function UserList({ users, onDelete }) {
return (
{users.map(user => (
{user.name}
onDelete(user.id)}>Delete
))}
);
}
// Основной компонент-контейнер, который связывает логику и представление
function GoodUserComponent() {
const { users, loading, deleteUser } = useUsers();
if (loading) return Loading...;
return (
User List
);
}Применение SRP особенно важно в средних и крупных приложениях. Оно упрощает:
UserList, можно использовать в разных частях приложения с разными данными.Вывод: Применяйте принцип единственной ответственности в React, чтобы создавать модульные, гибкие и легко поддерживаемые компоненты. Разделяйте компоненты на управляющие логикой (контейнеры, хуки) и отвечающие за отображение. Это особенно полезно в долгосрочных проектах и командах, где важна читаемость и тестируемость кода.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
React
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию