Первая программа на React
Первая программа на React
React представляет собой библиотеку для создания пользовательских интерфейсов, основанную на компонентном подходе. Создание первой программы позволяет познакомиться с ключевыми концепциями: компонентами, состоянием, JSX и обработкой событий. В данном материале рассматривается создание приложения «Счетчик», демонстрирующее два подхода к реализации: современный функциональный стиль с использованием хуков и классический подход с использованием классовых компонентов.
Создание проекта
Для начала работы требуется среда выполнения JavaScript — Node.js. Она обеспечивает возможность запуска серверной части разработки и управления зависимостями через пакетный менеджер npm.
Процесс инициализации нового проекта выполняется командой в терминале. Система автоматически создаст структуру папок, установит необходимые библиотеки React и настроит инструменты сборки.
npx create-react-app my-first-app
cd my-first-app
npm start
Команда npx выполняет скрипт установки без необходимости глобальной инсталляции. После завершения процесса создается директория my-first-app, содержащая исходный код, конфигурацию и зависимости. Переход в эту директорию (cd) и запуск команды npm start инициируют локальный сервер разработки. Приложение становится доступным по адресу http://localhost:3000.
Функциональный компонент с хуками
Современный стандарт разработки в React использует функциональные компоненты и хуки. Хуки позволяют использовать состояние и другие возможности React внутри обычных функций, что упрощает код и делает его более читаемым.
Основная логика приложения находится в файле src/App.js. Компонент импортирует хук useState из библиотеки React. Этот хук возвращает пару значений: текущее состояние и функцию для его обновления.
import React, { useState } from 'react';
import './App.css';
function App() {
const [count, setCount] = useState(0);
const [name, setName] = useState('');
const increment = () => setCount(count + 1);
const decrement = () => setCount(count - 1);
const reset = () => setCount(0);
return (
<div className="app">
<h1>Моя первая программа на React</h1>
<div className="greeting">
<input
type="text"
placeholder="Введите ваше имя"
value={name}
onChange={(e) => setName(e.target.value)}
/>
{name && <h2>Привет, {name}! 👋</h2>}
</div>
<div className="counter">
<h2>Счетчик: {count}</h2>
<div className="buttons">
<button onClick={decrement}>-</button>
<button onClick={reset}>Сброс</button>
<button onClick={increment}>+</button>
</div>
</div>
</div>
);
}
export default App;
Хук useState принимает начальное значение и возвращает массив из двух элементов. Первый элемент — это переменная состояния (count, name), второй — функция её изменения (setCount, setName). При вызове функции изменения React перерисовывает компонент, отображая новые данные.
JSX (JavaScript XML) позволяет писать разметку, похожую на HTML, непосредственно внутри JavaScript кода. Выражения внутри фигурных скобок {} вычисляются как JavaScript код. Условный рендеринг {name && <h2>...} отображает заголовок только тогда, когда переменная name содержит не пустое значение.
Обработка событий происходит через атрибуты, начинающиеся с on. Событие onChange срабатывает при изменении содержимого поля ввода. Аргументом функции обратного вызова является объект события, содержащий целевой элемент (target). Значение текущего ввода доступно через свойство value.
Классовый компонент
До появления хуков основным способом создания компонентов был классовой подход. Компоненты наследуются от базового класса Component из библиотеки React. Состояние хранится в свойстве this.state, а методы определяются как стрелочные функции или обычные методы класса.
import React, { Component } from 'react';
class App extends Component {
constructor(props) {
super(props);
this.state = {
count: 0,
name: ''
};
}
increment = () => {
this.setState({ count: this.state.count + 1 });
};
decrement = () => {
this.setState({ count: this.state.count - 1 });
};
reset = () => {
this.setState({ count: 0 });
};
handleNameChange = (event) => {
this.setState({ name: event.target.value });
};
render() {
return (
<div className="app">
<h1>Моя первая программа на React</h1>
<div className="greeting">
<input
type="text"
placeholder="Введите ваше имя"
value={this.state.name}
onChange={this.handleNameChange}
/>
{this.state.name && <h2>Привет, {this.state.name}! 👋</h2>}
</div>
<div className="counter">
<h2>Счетчик: {this.state.count}</h2>
<div className="buttons">
<button onClick={this.decrement}>-</button>
<button onClick={this.reset}>Сброс</button>
<button onClick={this.increment}>+</button>
</div>
</div>
</div>
);
}
}
export default App;
Конструктор класса вызывает метод super(props) для передачи свойств родительскому классу. Свойство this.state инициализируется объектом, содержащим начальные значения. Метод setState обновляет состояние компонента, вызывая перерисовку. В отличие от функциональных компонентов, где состояние изменяется напрямую функцией, здесь используется метод объекта.
Доступ к состоянию в методе render осуществляется через this.state. Обработчики событий передают ссылки на методы класса, которые должны быть привязаны к контексту экземпляра компонента. Стрелочные функции сохраняют ссылку на this, обеспечивая корректный доступ к свойствам состояния.
Стилизация интерфейса
Внешний вид приложения задается файлом src/App.css. CSS правила определяют расположение, цвета, шрифты и поведение элементов при взаимодействии.
.app {
text-align: center;
padding: 40px;
font-family: Arial, sans-serif;
}
.greeting {
margin: 30px 0;
padding: 20px;
background: #f0f0f0;
border-radius: 10px;
}
input {
padding: 10px;
font-size: 16px;
border: 2px solid #ddd;
border-radius: 5px;
margin-right: 10px;
}
button {
margin: 0 5px;
padding: 10px 20px;
font-size: 16px;
background: #61dafb;
border: none;
border-radius: 5px;
cursor: pointer;
transition: 0.3s;
}
button:hover {
background: #4fa8d5;
transform: scale(1.05);
}
.counter {
margin: 30px 0;
padding: 20px;
background: #e8f4f8;
border-radius: 10px;
}
Правило .app центрирует контент и добавляет внутренние отступы. Блок приветствия имеет серый фон и скругленные углы. Поля ввода имеют фиксированный размер шрифта и рамку. Кнопки окрашены в фирменный голубой цвет React, имеют плавный переход цвета и эффект масштабирования при наведении курсора.
Основные концепции приложения
Приложение демонстрирует фундаментальные принципы работы React.
Управление состоянием — это механизм хранения данных, влияющих на отображение интерфейса. Изменение состояния вызывает автоматическое обновление DOM. Хук useState предоставляет простой способ объявления и изменения состояния.
JSX — расширение синтаксиса JavaScript, позволяющее описывать структуру UI. Браузеры не понимают JSX напрямую, поэтому сборщики преобразуют его в обычный JavaScript код перед выполнением.
Обработка событий связывает действия пользователя с логикой приложения. События в React именуются в camelCase (например, onClick вместо onclick). Переданные функции вызываются при наступлении события.
Условный рендеринг позволяет показывать или скрывать элементы в зависимости от условий. Оператор && работает как короткое замыкание: если левая часть ложна, правая часть не вычисляется и не рендерится.
Компоненты представляют собой изолированные единицы кода, отвечающие за конкретный участок интерфейса. Каждый компонент имеет собственное состояние и логику, что способствует переиспользованию кода.
Расширение функционала
Полученное приложение служит базой для дальнейших экспериментов. Разработчики могут добавлять новые функции, изучая механизмы работы с данными и интерфейсом.
Добавление кнопки умножения счетчика на два требует объявления новой функции и подключения её к интерфейсу.
const multiply = () => setCount(count * 2);
<button onClick={multiply}>×2</button>
Создание списка задач (Todo list) предполагает использование массива в качестве состояния. Элементы массива добавляются, удаляются и маркируются как выполненные.
Таймер реализуется с помощью хука useEffect, который запускает интервал при монтировании компонента и очищает его при размонтировании.
Калькулятор демонстрирует работу с несколькими переменными состояния и сложной логикой вычислений.
Пошаговый запуск
Для успешного запуска приложения необходимо выполнить последовательность действий.
- Скачайте и установите Node.js с официального сайта nodejs.org.
- Откройте терминал или командную строку.
- Выполните команду
npx create-react-app my-app. Дождитесь окончания установки зависимостей. - Перейдите в созданную директорию командой
cd my-app. - Замените содержимое файла
src/App.jsкодом функционального компонента. - Замените содержимое файла
src/App.cssстилями из примера. - Запустите локальный сервер командой
npm start.
Браузер автоматически откроет страницу приложения. Любые изменения в коде сохраняются и мгновенно отображаются на странице благодаря системе горячей перезагрузки.
Рекомендации по развитию
React предоставляет мощный инструментарий для построения сложных интерфейсов. Автоматическая перерисовка гарантирует актуальность данных на экране. Компонентная архитектура позволяет строить большие системы из небольших, понятных частей.
Использование функциональных компонентов с хуками является предпочтительным стандартом современной разработки. Этот подход обеспечивает чистоту кода и упрощает тестирование.
Экспериментируйте с кодом, меняйте стили, добавляйте новые состояния и функции. Практика является лучшим способом усвоения материала.
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). ECMAScript — это официальный стандарт языка JavaScript, определяющий его синтаксис, семантику и встроенные объекты. Он описывает поведение языка независимо от среды выполнения (браузер, Node.js и… Фундамент для начинающего программиста - что повторить, как работать, чего ожидать. Для создания массивов используется литеральная нотация. Конструктор Array не применяется. Как работать с HTML-элементами, как их создавать, менять. JavaScript — это язык программирования, который изначально создавался для работы в веб-браузерах. Сегодня он является универсальным инструментом, позволяющим создавать серверные приложения, утилиты… Потребность в интерактивности возникла по мере роста сложности веб-сервисов. В частности, уже в первой половине 1990-х года в компании Netscape Communications, разрабатывавшей браузер Netscape… Такое именование представляет собой соглашение между разработчиками. Классический JavaScript не обеспечивает реальной приватности через подчеркивания. JavaScript содержит набор зарезервированных слов, которые имеют специальное значение в языке. Эти слова нельзя использовать в качестве идентификаторов для переменных, функций или классов. Функция Значение Пример --------------------------- Array.isArray() Проверяет, является ли значение массивом Array.isArray(1, 2) concat() Объединяет массивы 1, 2.concat(3, 4) push() Добавляет элемент… Этот шаблон описывает подключение внешних функций, классов или значений из других файлов. Он используется в начале файла и определяет зависимости текущего модуля. JavaScript используется для создания кроссплатформенных мобильных приложений, которые работают на iOS и Android с использованием единой кодовой базы. Что такое функция, параметры, аргументы, возврат значения.Основы JavaScript
Что требуется знать перед началом изучения языка программирования
Рекомендации по разработке на JavaScript
Работа с HTML в JavaScript
Простые приложения на JavaScript
История языка JavaScript
Синтаксис и пунктуация в JavaScript
Ключевые слова языка JavaScript
Встроенные функции JavaScript
Структура и подключение JavaScript-кода
Применение JavaScript в вебе и за его пределами
Функции в JavaScript