Написание React-компонентов — целое искусство. Дело не только в том, чтобы заставить их работать, но и в том, чтобы заставить их работать хорошо. Рассмотрим, как профессионально создавать компоненты, уделяя особое внимание читабельности, возможности повторного использования и эффективности.
Создание компонента списка
Начнем с создания базового компонента List (компонента списка):
// src/components/List.js import React from 'react'; const List = ({ data }) => { return ( <ul> {data.map((item, index) => ( <li key={index}>{item}</li> ))} </ul> ); }; export default List;
Этот компонент принимает массив data
и отображает его в виде списка.
Усовершенствование компонентов с помощью HOC
HOC (Higher-Order Components — компоненты высшего порядка) — мощный шаблон для повторного использования логики компонентов. Он оборачивает компонент, расширяя его функциональность без изменения структуры.
Например, HOC withLoading
можно использовать для отображения состояния загрузки:
// src/hocs/withLoading.js import React, { useState } from 'react'; function withLoading(Component) { return function WithLoading({ isLoading, ...props }) { if (isLoading) { return <div>Loading...</div>; } return <Component {...props} />; }; } export default withLoading;
Этот HOC проверяет параметр isLoading
. Если значение параметра “true” (“истинное”), то выводится сообщение “Loading…” (“Загрузка…”). В противном случае HOC отображает обернутый компонент, обеспечивая бесперебойную работу пользователя во время получения данных.
Аналогично работает withErrorHandling
— еще один HOC, который может управлять состояниями ошибок:
// src/hocs/withErrorHandling.js import React from 'react'; function withErrorHandling(Component) { return function WithErrorHandling({ error, ...props }) { if (error) { return <div>Error: {error.message}</div>; } return <Component {...props} />; }; } export default withErrorHandling;
При возникновении ошибки withErrorHandling
выводит сообщение об ошибке. В противном случае компонент отображается как обычно. Этот HOC особенно полезен для обработки ошибок получения данных или проблем в жизненном цикле компонента.
Комбинирование withLoading
и withErrorHandling
позволяет создать надежный компонент, который элегантно обрабатывает как состояния загрузки, так и состояния ошибки. Такой подход способствует повторному использованию кода и разделению задач, делая компоненты более удобными для обслуживания и простыми для понимания.
Получение данных с помощью хуков
React-хуки позволяют использовать состояние и другие возможности React без написания класса. useFetch — пользовательский хук, который получает данные из API:
// src/hooks/useFetch.js import { useState, useEffect } from 'react'; const useFetch = (url) => { const [data, setData] = useState([]); const [isLoading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { setLoading(true); try { const response = await fetch(url); if (!response.ok) { throw new Error('Network response was not ok'); } const json = await response.json(); setData(json); } catch (error) { setError(error); } finally { setLoading(false); } }; fetchData(); // Функция очистки return () => { // Логика очистки (при необходимости) }; }, [url]); return { data, isLoading, error }; }; export default useFetch;
Он обрабатывает состояние получения, хранение данных и ошибки, облегчая получение и отображение данных в компонентах.
Сборка приложения
Теперь прибегнем к помощи HOC’ов и хуков для сборки компонента App
:
// src/App.js import React from 'react'; import withLoading from './hocs/withLoading'; import withErrorHandling from './hocs/withErrorHandling'; // Добавлен новый HOC import useFetch from './hooks/useFetch'; import List from './components/List'; const ListWithLoading = withLoading(List); const ListWithErrorHandling = withErrorHandling(ListWithLoading); // Используется для добавления обработки ошибок в компонент ListWithLoading const App = () => { const { data, isLoading, error } = useFetch('https://api.example.com/data'); return ( <div> <h1>List Component</h1> <ListWithErrorHandling data={data} isLoading={isLoading} error={error} /> {/* Передает состояние ошибки компоненту ListWithLoading */} </div> ); }; export default App;
Хук useFetch
использован для загрузки данных и передачи их в компонент List
, который дополнен возможностями загрузки и обработки ошибок с помощью соответствующих HOC’ов.
Заключение
Писать компоненты на профессиональном уровне — значит думать об общей картине. Речь идет о создании компонентов, которые легко читать, поддерживать и повторно использовать. Используя такие паттерны, как HOC и хуки, можно создать чистую и эффективную кодовую базу, которая выдержит испытание временем.
Читайте также:
- 8 репозиториев, которые используют продвинутые React-разработчики
- 10 рекомендаций по повышению производительности от экспертов JS React
- Основы реактивного программирования
Читайте нас в Telegram, VK и Дзен
Перевод статьи Selcuk Ozdemir: Write a React Component Like a Pro