Введение в React: пошаговое руководство для начинающих разработчиков
Перейти

Введение в React: пошаговое руководство для начинающих разработчиков

#Веб-разработка  #Основы JavaScript  #React  
Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Начинающие веб-разработчики, интересующиеся современными технологиями
  • Студенты и учебные ресурсы для обучения программированию на React
  • Профессиональные разработчики, желающие улучшить свои навыки в React и фронтенд-разработке

Вы заглядывали в код современных веб-приложений и недоумевали, что означают все эти <div>, <App /> и useState()? React стал стандартом де-факто для создания интерактивных интерфейсов, но начинающим может казаться, что входной билет стоит слишком дорого. Не стоит отчаиваться — я помню свое первое знакомство с этой библиотекой и понимаю ваши сомнения. В этом руководстве мы разберем React с самых основ, шаг за шагом, с реальными примерами и практическим проектом, который вы сможете создать сами. Забудьте о страхе перед новыми технологиями — после этой статьи React станет вашим надежным инструментом. 🚀

Что такое React и почему его стоит изучать

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

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

Михаил, ведущий Front-end разработчик

Когда я начинал свой путь в веб-разработке в 2016 году, экосистема JavaScript казалась непреодолимой. jQuery был распространен повсеместно, Angular предлагал полный фреймворк, а React только набирал популярность. Я выбрал путь изучения React и спустя два месяца создал свое первое приложение — сервис для отслеживания расходов.

Именно компонентный подход React позволил мне структурировать код так, что даже когда проект вырос до 50+ компонентов, поддерживать его было несложно. Коллеги, работавшие с монолитной архитектурой, постоянно боролись с запутанным кодом и регрессиями. React не только сделал меня востребованным специалистом, но и изменил мой подход к проектированию интерфейсов навсегда.

Почему стоит изучать React в 2024 году? Давайте рассмотрим ключевые причины:

  • Высокий спрос на рынке труда — React стабильно занимает верхние строчки в списках самых востребованных навыков для фронтенд-разработчиков
  • Обширная экосистема — множество библиотек, инструментов и готовых решений
  • Отличная документация и сообщество — обучающие материалы, курсы и активная поддержка на форумах
  • Мобильная разработка — знание React позволяет легко перейти к React Native для создания нативных мобильных приложений
  • Декларативный подход — код становится более предсказуемым и легким для отладки
Характеристика React Vanilla JS jQuery
Управление DOM Virtual DOM Прямые манипуляции Прямые манипуляции
Организация кода Компонентная Произвольная Функциональная
Производительность Высокая Требует оптимизации Средняя
Порог вхождения Средний Низкий Низкий
Вакансии (2023) 76,800+ 42,300+ 28,700+

React — это не просто модная технология, это мощный инструмент, который решает реальные проблемы при разработке пользовательских интерфейсов. Инвестируя время в его изучение сейчас, вы приобретаете навык, который будет востребован многие годы. 💪

Пошаговый план для смены профессии

Настройка окружения для разработки на React

Прежде чем погрузиться в код, необходимо настроить рабочее окружение. Существует несколько способов начать работу с React, но я рекомендую использовать Create React App — официальный инструмент, который позволяет быстро запустить проект без сложной настройки сборки.

Для начала убедитесь, что у вас установлен Node.js (версии 14.0.0 или выше) и npm. Проверить их наличие можно командами в терминале:

node -v
npm -v

Если необходимо установить Node.js, скачайте последнюю версию с официального сайта: nodejs.org.

Теперь можно создать новый проект React с помощью одной команды:

npx create-react-app my-react-app

После завершения установки перейдите в директорию проекта и запустите приложение:

cd my-react-app
npm start

Браузер автоматически откроет страницу с адресом http://localhost:3000, где вы увидите стартовый экран React-приложения. Это означает, что настройка прошла успешно! 🎉

Структура проекта, созданного с помощью Create React App, включает несколько ключевых директорий:

  • src/ — здесь находятся исходные файлы вашего приложения
  • public/ — статические файлы, такие как index.html
  • node_modules/ — установленные зависимости (не редактируйте эту папку)
  • package.json — файл с конфигурацией проекта и списком зависимостей

Для более продвинутой разработки можно использовать дополнительные инструменты:

Инструмент Описание Установка
React DevTools Расширение для браузера, помогающее инспектировать компоненты Через магазин расширений Chrome/Firefox
ESLint Анализатор кода для обнаружения ошибок npm install eslint --save-dev
Prettier Форматирование кода npm install prettier --save-dev
TypeScript Типизация для JavaScript npx create-react-app my-app --template typescript
Vite Более быстрая альтернатива CRA npm create vite@latest my-app -- --template react

Если вы предпочитаете использовать код-редактор VSCode (что я настоятельно рекомендую), установите эти полезные расширения:

  • ES7 React/Redux/GraphQL/React-Native snippets
  • ESLint
  • Prettier – Code formatter
  • Auto Import
  • Path Intellisense

Теперь ваше окружение полностью готово для разработки на React. Вы можете редактировать файлы в директории src/, и изменения будут автоматически отображаться в браузере благодаря механизму Hot Reload. Давайте перейдем к основным концепциям React.

Основные концепции React: компоненты, JSX и Virtual DOM

React построен на трех фундаментальных концепциях: компоненты, JSX и Virtual DOM. Понимание этих основ — ключ к успешному освоению библиотеки.

Компоненты — это самодостаточные, переиспользуемые части кода, которые возвращают React-элементы. Они бывают двух типов:

  • Функциональные компоненты — JavaScript-функции, которые принимают props и возвращают React-элементы
  • Классовые компоненты — ES6-классы, расширяющие React.Component

Современный подход отдает предпочтение функциональным компонентам благодаря их простоте и возможностям хуков. Вот пример функционального компонента:

JS
Скопировать код
function Welcome(props) {
return <h1>Привет, {props.name}</h1>;
}

JSX — это расширение синтаксиса JavaScript, которое позволяет писать HTML-подобную структуру прямо в JavaScript-коде. Это делает разработку более интуитивной, так как мы видим, как будет выглядеть наш интерфейс.

JS
Скопировать код
const element = <h1>Привет, мир!</h1>;

Под капотом JSX преобразуется в вызовы React.createElement(), что делает его более читабельной альтернативой чистому JavaScript:

JS
Скопировать код
// То, что вы пишете с JSX
const element = <h1 className="greeting">Привет, мир!</h1>;

// То, во что это преобразуется
const element = React.createElement(
'h1',
{className: 'greeting'},
'Привет, мир!'
);

JSX позволяет использовать выражения JavaScript внутри фигурных скобок, что делает его очень гибким:

JS
Скопировать код
function Greeting(props) {
return <h1>{props.isLoggedIn ? 'Добро пожаловать!' : 'Пожалуйста, войдите'}</h1>;
}

Virtual DOM — это легковесное представление реального DOM в памяти. Когда состояние компонента меняется, React создает новый виртуальный DOM и сравнивает его с предыдущим. Затем определяет минимально необходимые изменения и обновляет только те части реального DOM, которые изменились.

Алексей, технический директор

В 2019 году моя команда столкнулась с серьезной проблемой производительности в клиентском проекте — веб-приложении для визуализации больших объемов данных. Каждое обновление данных вызывало полную перерисовку страницы и занимало до 3 секунд, что было неприемлемо для пользователей.

Мы приняли решение переписать критические компоненты с использованием React. Благодаря Virtual DOM и продуманному разделению на компоненты, нам удалось сократить время обновления интерфейса до 200 мс. Помню, как клиент был в восторге от плавности интерфейса после рефакторинга.

Именно тогда я осознал, что React — это не просто модная библиотека, а инструмент, решающий реальные производительные проблемы. С тех пор все наши новые проекты мы начинаем с React.

Этот процесс называется "согласование" (reconciliation) и является ключом к эффективности React. Сравним рендеринг в React и традиционных подходах:

  1. Традиционный подход: при изменении данных полностью перестраивается DOM-дерево, что затратно по ресурсам
  2. React-подход: обновляется только Virtual DOM, затем только необходимые изменения применяются к реальному DOM

Компоненты React следуют принципу однонаправленного потока данных. Данные передаются от родительского компонента к дочернему через props. Это делает поведение приложения более предсказуемым и облегчает отладку.

Важно понимать, что props (свойства) являются доступными только для чтения. Компонент никогда не должен изменять свои props напрямую. Для управления изменяющимися данными используется state (состояние).

Эти три концепции — компоненты, JSX и Virtual DOM — формируют фундамент React и делают его мощным инструментом для создания сложных пользовательских интерфейсов. В следующем разделе мы рассмотрим, как управлять состоянием компонентов. 🧩

Управление состоянием и передача данных в React

Эффективное управление состоянием — один из ключевых аспектов разработки на React. Состояние (state) — это объект, который содержит данные, которые могут изменяться в течение жизненного цикла компонента. В отличие от props, state принадлежит самому компоненту и может быть изменен внутри него.

В современном React для управления состоянием используется хук useState. Это простой способ добавить локальное состояние в функциональный компонент:

JS
Скопировать код
import { useState } from 'react';

function Counter() {
const [count, setCount] = useState(0);

return (
<div>
<p>Вы кликнули {count} раз</p>
<button onClick={() => setCount(count + 1)}>
Нажми меня
</button>
</div>
);
}

В этом примере:

  • useState(0) инициализирует состояние со значением 0
  • count — текущее значение состояния
  • setCount — функция для обновления состояния

Важно помнить, что обновление состояния в React происходит асинхронно, и React может объединять несколько вызовов setState для повышения производительности. Если новое состояние зависит от предыдущего, используйте функциональную форму:

JS
Скопировать код
// Может привести к непредсказуемым результатам
setCount(count + 1);
setCount(count + 1);

// Правильный подход
setCount(prevCount => prevCount + 1);
setCount(prevCount => prevCount + 1);

Для более сложных состояний используйте хук useReducer, который предоставляет более структурированный подход, похожий на Redux:

JS
Скопировать код
import { useReducer } from 'react';

// Редьюсер определяет, как состояние обновляется
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count – 1 };
default:
throw new Error();
}
}

function Counter() {
const [state, dispatch] = useReducer(reducer, { count: 0 });

return (
<div>
Count: {state.count}
<button onClick={() => dispatch({type: 'increment'})}>+</button>
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
</div>
);
}

Для передачи данных между компонентами React использует следующие основные механизмы:

  1. Props — для передачи данных от родителя к дочернему компоненту
  2. Подъем состояния (Lifting State Up) — для передачи данных от дочернего компонента к родителю
  3. Context API — для передачи данных глубоко в дерево компонентов без явной передачи через props

Рассмотрим пример использования Context API для обмена данными:

JS
Скопировать код
// Создаем контекст
const ThemeContext = React.createContext('light');

// Компонент-провайдер
function App() {
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}

// Промежуточный компонент
function Toolbar() {
return <ThemedButton />;
}

// Компонент-потребитель
function ThemedButton() {
const theme = useContext(ThemeContext);
return <button className={theme}>Стилизованная кнопка</button>;
}

Выбор правильного подхода к управлению состоянием зависит от сложности вашего приложения:

Подход Применимость Преимущества Недостатки
useState Простые компоненты с локальным состоянием Простота использования, низкий порог вхождения Не подходит для сложной логики состояния
useReducer Компоненты с комплексной логикой обновления состояния Предсказуемое обновление состояния, тестируемость Требует больше кода, чем useState
Context API Глобальные данные, используемые во многих компонентах Избегает "prop drilling", упрощает структуру компонентов Может вызывать перерисовку множества компонентов
Redux Крупные приложения с комплексным состоянием Централизованное хранилище, DevTools, middleware Дополнительная сложность, большой объем шаблонного кода
Recoil/Jotai Приложения со сложными зависимостями в состоянии Атомарный подход, минимальные перерисовки Дополнительная зависимость, менее зрелые решения

Для начала рекомендую осваивать базовые инструменты управления состоянием — useState и props. По мере усложнения ваших приложений, вы можете постепенно добавлять более продвинутые техники, такие как Context API или библиотеки управления состоянием. 🔄

Практический проект: создаём первое приложение на React

Теория без практики не имеет смысла, особенно в программировании. Давайте применим полученные знания и создадим полноценное приложение — простой список задач (Todo List). Этот проект идеально подходит для закрепления основных концепций React, поскольку включает управление состоянием, условный рендеринг и обработку событий.

Если вы ещё не создали проект, выполните:

npx create-react-app todo-app
cd todo-app
npm start

Давайте начнем с создания компонента TodoList. Откройте файл src/App.js и замените его содержимое на следующее:

JS
Скопировать код
import { useState } from 'react';
import './App.css';

function App() {
const [todos, setTodos] = useState([]);
const [inputValue, setInputValue] = useState('');

// Добавление новой задачи
const handleAddTodo = () => {
if (inputValue.trim() !== '') {
setTodos([...todos, {
id: Date.now(),
text: inputValue,
completed: false
}]);
setInputValue('');
}
};

// Переключение статуса задачи
const handleToggleTodo = (id) => {
setTodos(
todos.map(todo =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
)
);
};

// Удаление задачи
const handleDeleteTodo = (id) => {
setTodos(todos.filter(todo => todo.id !== id));
};

return (
<div className="App">
<h1>Список задач</h1>

<div className="todo-input">
<input
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="Что нужно сделать?"
onKeyPress={(e) => e.key === 'Enter' && handleAddTodo()}
/>
<button onClick={handleAddTodo}>Добавить</button>
</div>

<ul className="todo-list">
{todos.length === 0 && (
<li className="empty-list">Список задач пуст</li>
)}

{todos.map(todo => (
<li key={todo.id} className={todo.completed ? 'completed' : ''}>
<span onClick={() => handleToggleTodo(todo.id)}>
{todo.text}
</span>
<button onClick={() => handleDeleteTodo(todo.id)}>Удалить</button>
</li>
))}
</ul>

{todos.length > 0 && (
<div className="todo-stats">
<p>Всего задач: {todos.length}</p>
<p>Выполнено: {todos.filter(todo => todo.completed).length}</p>
</div>
)}
</div>
);
}

export default App;

Теперь добавим немного стилей. Откройте файл src/App.css и добавьте следующее:

CSS
Скопировать код
.App {
max-width: 500px;
margin: 0 auto;
padding: 20px;
font-family: Arial, sans-serif;
}

h1 {
text-align: center;
color: #333;
}

.todo-input {
display: flex;
margin-bottom: 20px;
}

input {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px 0 0 4px;
font-size: 16px;
}

button {
padding: 10px 15px;
border: none;
background-color: #4caf50;
color: white;
cursor: pointer;
font-size: 16px;
border-radius: 0 4px 4px 0;
}

.todo-list {
list-style-type: none;
padding: 0;
}

.todo-list li {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 15px;
margin-bottom: 10px;
background-color: #f9f9f9;
border-radius: 4px;
transition: background-color 0.3s;
}

.todo-list li span {
cursor: pointer;
flex: 1;
}

.todo-list li.completed span {
text-decoration: line-through;
color: #888;
}

.todo-list li button {
background-color: #f44336;
border-radius: 4px;
margin-left: 10px;
padding: 8px 12px;
}

.empty-list {
text-align: center;
color: #888;
font-style: italic;
}

.todo-stats {
margin-top: 20px;
display: flex;
justify-content: space-between;
color: #666;
}

Теперь запустите приложение командой npm start и посмотрите на результат в браузере. У вас должно быть работающее приложение со списком задач! 📋

Давайте разберём, что мы сделали:

  • Использовали useState для управления состоянием списка задач и текущего ввода
  • Создали функции для добавления, переключения и удаления задач
  • Применили условный рендеринг с помощью оператора && для показа сообщения о пустом списке
  • Использовали метод map для рендеринга списка задач
  • Добавили обработчики событий для взаимодействия с пользователем
  • Применили CSS-стили для оформления компонентов

Для улучшения нашего приложения можно добавить дополнительные функции:

  1. Фильтрация задач (все, активные, завершенные)
  2. Сохранение задач в localStorage для сохранения при перезагрузке страницы
  3. Разделение на компоненты (TodoList, TodoItem, TodoForm) для лучшей организации кода
  4. Анимации при добавлении и удалении задач
  5. Редактирование существующих задач

Вот пример того, как можно реализовать сохранение задач в localStorage с помощью useEffect:

JS
Скопировать код
import { useState, useEffect } from 'react';

function App() {
// Загружаем задачи из localStorage при монтировании компонента
const [todos, setTodos] = useState(() => {
const savedTodos = localStorage.getItem('todos');
return savedTodos ? JSON.parse(savedTodos) : [];
});
const [inputValue, setInputValue] = useState('');

// Сохраняем задачи в localStorage при обновлении
useEffect(() => {
localStorage.setItem('todos', JSON.stringify(todos));
}, [todos]);

// Остальной код остается без изменений
// ...
}

По мере роста вашего приложения, вы можете разделить его на отдельные компоненты. Например, можно создать компонент TodoItem для отдельной задачи, что сделает ваш код более модульным и поддерживаемым.

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

React превратил сложную задачу создания интерактивных интерфейсов в понятную и структурированную разработку. Компонентный подход позволяет масштабировать приложения от простых списков до сложных систем, сохраняя при этом читаемость кода. Изучив основы React, вы получили фундамент, на котором можно строить дальнейшее развитие — от хуков эффектов до маршрутизации и управления глобальным состоянием. Вместо бесконечной борьбы с DOM и запутанными событиями, вы теперь можете сосредоточиться на бизнес-логике и создавать по-настоящему потрясающие приложения.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что такое компоненты в React?
1 / 5

Ольга Шадрина

React-разработчик

Свежие материалы

Загрузка...