React — это популярная JavaScript-библиотека для создания пользовательских интерфейсов, разработанная Facebook. Основная задача React — упростить создание динамических, интерактивных веб-приложений с большим количеством данных, изменяющихся в реальном времени.
React решает следующие ключевые задачи:
React — это библиотека для создания пользовательских интерфейсов, которая позволяет разработчикам создавать веб-приложения с динамическим контентом. В отличие от фреймворков (например, Angular), React фокусируется только на слое представления (view layer).
React был представлен Facebook в 2013 году и с тех пор стал одной из самых популярных технологий для фронтенд-разработки. Вот ключевые особенности React:
// Пример простого компонента React
function Welcome(props) {
return <h1>Привет, {props.name}!</h1>;
}
// Использование компонента
const element = <Welcome name="Александр" />;Одна из главных проблем веб-разработки — медленная работа с DOM. Каждое изменение в DOM вызывает перерисовку страницы, что может быть ресурсоемким.
Проблема:
// Традиционный подход - прямые манипуляции с DOM
document.getElementById('counter').innerHTML = 'Счетчик: ' + count;
document.getElementById('counter').style.color = count > 10 ? 'red' : 'black';Решение React:
// React использует Virtual DOM для оптимизации
function Counter({ count }) {
return (
<div style={{ color: count > 10 ? 'red' : 'black' }}>
Счетчик: {count}
</div>
);
}React решает эту проблему через Virtual DOM:
В традиционных веб-приложениях управление состоянием интерфейса становится сложным по мере роста приложения.
Проблема:
// Без React - сложно отслеживать состояние
let isVisible = true;
let items = [];
let selectedId = null;
// При изменении любого значения нужно обновлять DOM вручную
function toggleVisibility() {
isVisible = !isVisible;
// Обновляем DOM вручную
document.getElementById('dropdown').style.display =
isVisible ? 'block' : 'none';
}Решение React:
// С React - состояние управляется декларативно
function Dropdown() {
const [isVisible, setIsVisible] = useState(true);
return (
<div>
<button onClick={() => setIsVisible(!isVisible)}>
Переключить
</button>
{isVisible && <div>Содержимое выпадающего списка</div>}
</div>
);
}Создание переиспользуемых UI-компонентов в традиционном JavaScript требует много шаблонного кода.
Проблема:
// Без React - сложное переиспользование
function createButton(text, onClick, type) {
const button = document.createElement('button');
button.textContent = text;
button.addEventListener('click', onClick);
button.className = 'btn btn-' + type;
return button;
}
// Для каждого нового кнопка нужно создавать заново
const saveButton = createButton('Сохранить', saveHandler, 'primary');
const cancelButton = createButton('Отмена', cancelHandler, 'secondary');Решение React:
// С React - простое создание переиспользуемых компонентов
function Button({ text, onClick, type = 'primary' }) {
return (
<button className={`btn btn-${type}`} onClick={onClick}>
{text}
</button>
);
}
// Легко переиспользуем компонент
<Button text="Сохранить" onClick={saveHandler} type="primary" />
<Button text="Отмена" onClick={cancelHandler} type="secondary" />Управление асинхронными операциями (запросы к API, таймеры) в традиционном JavaScript требует много внимания к деталям.
Проблема:
// Без React - сложно управлять асинхронными операциями
let users = [];
let isLoading = false;
function loadUsers() {
isLoading = true;
// Обновляем DOM вручную
document.getElementById('loading').style.display = 'block';
fetch('/api/users')
.then(response => response.json())
.then(data => {
users = data;
isLoading = false;
// Обновляем DOM вручную
document.getElementById('loading').style.display = 'none';
renderUsers(users);
})
.catch(error => {
isLoading = false;
// Обновляем DOM вручную
document.getElementById('loading').style.display = 'none';
document.getElementById('error').textContent = error.message;
});
}Решение React:
// С React - декларативное управление состоянием
function UserList() {
const [users, setUsers] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
setIsLoading(true);
fetch('/api/users')
.then(response => response.json())
.then(data => {
setUsers(data);
setIsLoading(false);
})
.catch(error => {
setError(error.message);
setIsLoading(false);
});
}, []);
if (isLoading) return <div>Загрузка...</div>;
if (error) return <div>Ошибка: {error}</div>;
return (
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}Компоненты — это строительные блоки React-приложений. Они позволяют разделить UI на независимые, переиспользуемые части.
// Функциональный компонент
function UserProfile({ user }) {
return (
<div className="user-profile">
<img src={user.avatar} alt={user.name} />
<h2>{user.name}</h2>
<p>{user.email}</p>
</div>
);
}
// Можно использовать компонент многократно
<UserProfile user={user1} />
<UserProfile user={user2} />Состояние — это данные, которые могут изменяться со временем и влияют на рендер компонента.
function Counter() {
// useState - хук для управления состоянием
const [count, setCount] = useState(0);
return (
<div>
<p>Счетчик: {count}</p>
<button onClick={() => setCount(count + 1)}>
Увеличить
</button>
</div>
);
}Props — это способ передачи данных от родительского компонента к дочернему.
function Greeting({ name, age }) {
return (
<div>
<h1>Привет, {name}!</h1>
<p>Ваш возраст: {age}</p>
</div>
);
}
// Передаем данные через props
<Greeting name="Александр" age={25} />React управляет жизненным циклом компонентов, что позволяет выполнять код на разных этапах.
function DataFetcher({ userId }) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
// useEffect - хук для работы с побочными эффектами
useEffect(() => {
// Выполняется при монтировании и обновлении
setLoading(true);
fetchData(userId)
.then(result => {
setData(result);
setLoading(false);
});
// Функция очистки (выполняется при размонтировании)
return () => {
// Отмена запросов, очистка таймеров и т.д.
};
}, [userId]); // Зависимости - компонент обновится при их изменении
if (loading) return <div>Загрузка...</div>;
return <div>{JSON.stringify(data)}</div>;
}Благодаря Virtual DOM и алгоритму согласования (reconciliation), React минимизирует количество операций с реальным DOM.
React позволяет описывать, как должен выглядеть интерфейс в зависимости от состояния, а не как его изменять.
// Декларативный подход
function TodoList({ todos }) {
return (
<ul>
{todos.map(todo => (
<li key={todo.id} className={todo.completed ? 'completed' : ''}>
{todo.text}
</li>
))}
</ul>
);
}React имеет огромное сообщество и богатую экосистему библиотек:
Компонентный подход позволяет создавать библиотеки переиспользуемых компонентов.
React Native позволяет использовать знания React для создания мобильных приложений.
React особенно полезен в следующих случаях:
React — это мощная библиотека для создания пользовательских интерфейсов, которая решает ключевые проблемы веб-разработки:
Основные преимущества:
Ключевые концепции:
React не решает всех проблем фронтенд-разработки, но существенно упрощает создание сложных интерактивных интерфейсов, делая код более предсказуемым и поддерживаемым.
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪