React: Подробное руководство для начинающих

React: Подробное руководство для начинающих

React – это популярная JavaScript-библиотека для создания пользовательских интерфейсов (UI). Разработанная Facebook, React позволяет разработчикам создавать большие веб-приложения, которые могут динамически отображать данные, не требуя перезагрузки страницы. Она основана на компонентном подходе, что делает код более организованным, повторно используемым и легким в поддержке. В этой статье мы подробно рассмотрим, что такое React, почему его стоит использовать, и как начать создавать свои собственные React-приложения. Мы также разберем основные концепции и дадим практические примеры кода.

Что такое React?

React – это JavaScript-библиотека, разработанная Facebook для создания интерактивных пользовательских интерфейсов. В отличие от фреймворков, таких как Angular или Vue, React – это именно библиотека, что означает, что он в основном занимается только UI-слоем вашего приложения. React использует виртуальный DOM, что делает обновления UI быстрыми и эффективными. Вместо того чтобы перерисовывать весь DOM при каждом изменении данных, React определяет, какие части DOM необходимо обновить, и обновляет только их. Это значительно повышает производительность веб-приложений.

Основные характеристики React:

* **Компонентный подход:** UI разбивается на независимые, повторно используемые компоненты. Каждый компонент отвечает за отображение определенной части UI.
* **Виртуальный DOM:** React использует виртуальный DOM для эффективного обновления UI.
* **JSX:** React использует расширение JavaScript под названием JSX, которое позволяет писать HTML-подобный код внутри JavaScript.
* **Однонаправленный поток данных:** Данные в React передаются только в одном направлении, что упрощает отслеживание изменений и отладку.
* **Декларативный подход:** Вы описываете, как должен выглядеть UI на основе текущего состояния данных, а React сам занимается обновлением DOM.

Почему стоит использовать React?

Существует множество причин, по которым React стал таким популярным среди разработчиков. Вот некоторые из них:

* **Производительность:** Виртуальный DOM делает React очень быстрым и эффективным.
* **Компонентный подход:** Компоненты упрощают разработку, поддержку и повторное использование кода.
* **Большое сообщество:** React имеет огромное и активное сообщество разработчиков, которые готовы помочь вам с любыми вопросами.
* **Широкий выбор библиотек и инструментов:** Существует множество библиотек и инструментов, которые можно использовать с React для упрощения разработки.
* **SEO-дружественность:** React может быть рендеризирован на сервере, что делает его более SEO-дружественным, чем другие JavaScript-фреймворки.
* **Простота изучения:** React относительно легко изучить, особенно если у вас уже есть опыт работы с JavaScript.
* **Поддержка Facebook:** React поддерживается Facebook, что гарантирует его долгосрочную поддержку и развитие.

Начало работы с React

Чтобы начать работать с React, вам понадобится:

* **Node.js и npm (или yarn):** Node.js – это среда выполнения JavaScript, а npm (Node Package Manager) – это менеджер пакетов для JavaScript.
* **Текстовый редактор:** Например, VS Code, Sublime Text, Atom и т.д.
* **Веб-браузер:** Например, Chrome, Firefox, Safari.

Шаг 1: Установка Node.js и npm

Если у вас еще не установлены Node.js и npm, вам необходимо их установить. Скачайте установщик с официального сайта Node.js ([https://nodejs.org/](https://nodejs.org/)) и следуйте инструкциям по установке. npm обычно устанавливается вместе с Node.js.

Чтобы проверить, установлены ли Node.js и npm, откройте командную строку (или терминал) и выполните следующие команды:

bash
node -v
npm -v

Если команды выводят версии Node.js и npm, значит, они установлены успешно.

Шаг 2: Создание нового React-приложения

Самый простой способ создать новое React-приложение – использовать Create React App. Это инструмент, разработанный Facebook, который автоматически настраивает все необходимое для начала работы с React.

Откройте командную строку и перейдите в каталог, в котором хотите создать свое приложение. Затем выполните следующую команду:

bash
npx create-react-app my-app

Замените `my-app` на название своего приложения. Create React App создаст новый каталог с этим названием и установит все необходимые зависимости.

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

bash
cd my-app

Шаг 3: Запуск React-приложения

Чтобы запустить React-приложение, выполните следующую команду:

bash
npm start

Эта команда запустит сервер разработки, и ваше приложение откроется в браузере по адресу `http://localhost:3000`. Вы увидите страницу приветствия React.

Структура проекта, созданного Create React App

После того, как Create React App создаст проект, вы увидите следующую структуру каталогов:

my-app/
node_modules/
public/
index.html
favicon.ico
src/
App.js
App.css
index.js
index.css
logo.svg
package.json
README.md

* **`node_modules`:** Каталог, содержащий все установленные зависимости.
* **`public`:** Каталог, содержащий статические файлы, такие как `index.html` и `favicon.ico`.
* **`src`:** Каталог, содержащий исходный код вашего приложения.
* **`App.js`:** Главный компонент вашего приложения.
* **`App.css`:** Стили для компонента `App.js`.
* **`index.js`:** Точка входа в ваше приложение. Здесь React монтируется в DOM.
* **`index.css`:** Общие стили для вашего приложения.
* **`logo.svg`:** Логотип React.
* **`package.json`:** Файл, содержащий информацию о вашем приложении, включая зависимости и скрипты.
* **`README.md`:** Файл с описанием вашего приложения.

Основные концепции React

Теперь, когда вы создали свое первое React-приложение, давайте рассмотрим основные концепции React, которые вам необходимо знать.

Компоненты

Компоненты – это основные строительные блоки React-приложений. Компонент – это независимая, повторно используемая часть UI. Компоненты могут быть как функциональными, так и классовыми.

**Функциональные компоненты:**

Функциональные компоненты – это просто JavaScript-функции, которые возвращают JSX.

javascript
function MyComponent() {
return (

Привет, мир!

);
}

export default MyComponent;

**Классовые компоненты:**

Классовые компоненты – это JavaScript-классы, которые расширяют класс `React.Component` и имеют метод `render`, который возвращает JSX.

javascript
import React from ‘react’;

class MyComponent extends React.Component {
render() {
return (

Привет, мир!

);
}
}

export default MyComponent;

В современных React-приложениях рекомендуется использовать функциональные компоненты с хуками (hooks), так как они более лаконичны и просты в использовании. Классовые компоненты все еще используются, но их популярность снижается.

JSX

JSX – это расширение JavaScript, которое позволяет писать HTML-подобный код внутри JavaScript. JSX преобразуется в обычный JavaScript код с помощью Babel.

javascript
const element =

Привет, мир!

;

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

**Особенности JSX:**

* **HTML-подобный синтаксис:** JSX использует HTML-подобный синтаксис, что делает его легким для понимания.
* **JavaScript-выражения:** Внутри JSX можно использовать JavaScript-выражения, заключенные в фигурные скобки `{}`.
* **Атрибуты:** Атрибуты в JSX пишутся в camelCase, например, `className` вместо `class` и `onClick` вместо `onclick`.
* **Один корневой элемент:** Каждый JSX-элемент должен иметь один корневой элемент. Если вам нужно вернуть несколько элементов, оберните их в один родительский элемент, например, `

` или ``. `<>` является сокращением для ``.

Состояние (State)

Состояние – это данные, которые компонент хранит и управляет ими. Когда состояние компонента меняется, React перерисовывает компонент, чтобы отразить эти изменения в UI. Состояние позволяет компонентам быть динамическими и реагировать на действия пользователя.

**Использование состояния в функциональных компонентах с хуками:**

Для управления состоянием в функциональных компонентах используется хук `useState`.

javascript
import React, { useState } from ‘react’;

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

return (

Вы нажали кнопку {count} раз

);
}

export default Counter;

В этом примере `useState(0)` создает переменную состояния `count` и функцию `setCount` для ее обновления. Начальное значение `count` равно 0. Когда пользователь нажимает на кнопку, функция `setCount` вызывается с новым значением `count + 1`, и React перерисовывает компонент, чтобы отобразить новое значение `count`.

**Использование состояния в классовых компонентах:**

В классовых компонентах состояние хранится в свойстве `state` и обновляется с помощью метода `setState`.

javascript
import React from ‘react’;

class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}

handleClick() {
this.setState({ count: this.state.count + 1 });
}

render() {
return (

Вы нажали кнопку {this.state.count} раз

);
}
}

export default Counter;

В этом примере состояние `count` инициализируется в конструкторе. Метод `handleClick` вызывает `this.setState` для обновления состояния `count`. React перерисовывает компонент при каждом изменении состояния.

Пропсы (Props)

Пропсы – это способ передачи данных от родительского компонента к дочернему. Пропсы – это неизменяемые данные, то есть дочерний компонент не может изменять пропсы, которые ему передал родительский компонент.

javascript
function Greeting(props) {
return

Привет, {props.name}!

;
}

function App() {
return ;
}

export default App;

В этом примере компонент `Greeting` принимает пропс `name` и отображает его в приветствии. Компонент `App` передает пропс `name` со значением “Иван” компоненту `Greeting`.

Хуки (Hooks)

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

Наиболее часто используемые хуки:

* **`useState`:** Управление состоянием компонента.
* **`useEffect`:** Выполнение побочных эффектов, таких как запросы к API или подписка на события.
* **`useContext`:** Доступ к контексту React.
* **`useReducer`:** Управление сложным состоянием с помощью редьюсера.
* **`useCallback`:** Мемоизация функций, чтобы предотвратить ненужные перерисовки компонентов.
* **`useMemo`:** Мемоизация значений, чтобы предотвратить ненужные вычисления.
* **`useRef`:** Доступ к DOM-элементам или сохранение значений между перерисовками.

**Пример использования `useEffect` для выполнения запроса к API:**

javascript
import React, { useState, useEffect } from ‘react’;

function DataFetcher() {
const [data, setData] = useState(null);

useEffect(() => {
async function fetchData() {
const response = await fetch(‘https://jsonplaceholder.typicode.com/todos/1’);
const json = await response.json();
setData(json);
}

fetchData();
}, []);

if (!data) {
return

Загрузка…

;
}

return (

{data.title}

Завершено: {data.completed ? ‘Да’ : ‘Нет’}

);
}

export default DataFetcher;

В этом примере хук `useEffect` вызывается один раз при монтировании компонента (благодаря пустому массиву `[]` в качестве второго аргумента). Внутри `useEffect` выполняется запрос к API и полученные данные сохраняются в состоянии `data`. React перерисовывает компонент, когда данные загружены.

Жизненный цикл компонентов (Component Lifecycle)

Жизненный цикл компонентов – это последовательность этапов, которые проходит компонент от момента создания до момента удаления из DOM. В классовых компонентах существуют методы жизненного цикла, которые позволяют выполнять код на определенных этапах жизни компонента.

Основные методы жизненного цикла (в классовых компонентах):

* **`constructor`:** Вызывается при создании компонента. Здесь обычно инициализируется состояние и привязываются обработчики событий.
* **`render`:** Вызывается при каждой перерисовке компонента. Возвращает JSX, который описывает структуру UI.
* **`componentDidMount`:** Вызывается после того, как компонент был добавлен в DOM. Здесь обычно выполняются запросы к API или подписка на события.
* **`componentDidUpdate`:** Вызывается после того, как компонент был обновлен. Здесь можно выполнять код на основе изменений в состоянии или пропсах.
* **`componentWillUnmount`:** Вызывается перед тем, как компонент будет удален из DOM. Здесь необходимо отписываться от событий и освобождать ресурсы.

В функциональных компонентах хук `useEffect` заменяет большинство методов жизненного цикла. `useEffect` может выполнять код как при монтировании компонента, так и при его обновлении и удалении.

Условный рендеринг (Conditional Rendering)

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

* **`if/else`:** Самый простой способ условного рендеринга.
* **Тернарный оператор:** Более компактный способ условного рендеринга.
* **Оператор `&&`:** Отображает элемент только если условие истинно.

**Пример использования `if/else`:**

javascript
function Greeting(props) {
if (props.isLoggedIn) {
return

Добро пожаловать, {props.name}!

;
} else {
return

Пожалуйста, войдите в систему.

;
}
}

export default Greeting;

**Пример использования тернарного оператора:**

javascript
function Greeting(props) {
return props.isLoggedIn ? (

Добро пожаловать, {props.name}!

) : (

Пожалуйста, войдите в систему.

);
}

export default Greeting;

**Пример использования оператора `&&`:**

javascript
function Message(props) {
return (

{props.unreadMessages.length > 0 && (

У вас {props.unreadMessages.length} непрочитанных сообщений.

)}

);
}

export default Message;

Списки и ключи (Lists and Keys)

При рендеринге списков элементов в React необходимо указывать уникальный ключ (`key`) для каждого элемента списка. Ключи помогают React эффективно обновлять DOM при изменении списка.

javascript
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>

  • {number}
  • );
    return (

      {listItems}

    );
    }

    const numbers = [1, 2, 3, 4, 5];

    function App() {
    return ;
    }

    export default App;

    В этом примере ключ устанавливается равным значению элемента списка. В реальных приложениях лучше использовать уникальные идентификаторы, например, ID из базы данных.

    **Важно:** Ключи должны быть уникальными среди соседних элементов списка.

    Обработка событий (Event Handling)

    React предоставляет механизм для обработки событий DOM, таких как клики, нажатия клавиш и изменения в полях ввода. Обработчики событий передаются элементам как пропсы.

    javascript
    function MyButton() {
    function handleClick(event) {
    alert(‘Кнопка была нажата!’);
    event.preventDefault(); // Предотвращает действие по умолчанию
    }

    return (

    );
    }

    export default MyButton;

    В этом примере функция `handleClick` вызывается при нажатии на кнопку. Аргумент `event` содержит информацию о событии.

    **Важно:** Обработчики событий в React пишутся в camelCase, например, `onClick` вместо `onclick`.

    Формы (Forms)

    React предоставляет два способа управления формами:

    * **Неконтролируемые компоненты:** Значения полей формы хранятся в DOM и доступны через `refs`.
    * **Контролируемые компоненты:** Значения полей формы хранятся в состоянии компонента и обновляются с помощью обработчиков событий.

    Рекомендуется использовать контролируемые компоненты, так как они позволяют лучше контролировать состояние формы и упрощают валидацию данных.

    **Пример контролируемого компонента:**

    javascript
    import React, { useState } from ‘react’;

    function MyForm() {
    const [name, setName] = useState(”);

    function handleChange(event) {
    setName(event.target.value);
    }

    function handleSubmit(event) {
    alert(‘Имя: ‘ + name);
    event.preventDefault();
    }

    return (



    );
    }

    export default MyForm;

    В этом примере значение поля ввода `name` хранится в состоянии компонента и обновляется при каждом изменении в поле ввода.

    Маршрутизация (Routing)

    Маршрутизация позволяет создавать многостраничные приложения с разными URL-адресами. Для маршрутизации в React часто используют библиотеку React Router.

    **Установка React Router:**

    bash
    npm install react-router-dom

    **Пример использования React Router:**

    javascript
    import React from ‘react’;
    import { BrowserRouter as Router, Route, Link } from ‘react-router-dom’;

    function Home() {
    return

    Главная страница

    ;
    }

    function About() {
    return

    О нас

    ;
    }

    function App() {
    return (



    );
    }

    export default App;

    В этом примере React Router используется для определения двух маршрутов: `/` (главная страница) и `/about` (страница о нас). Компоненты `Home` и `About` отображаются в зависимости от текущего URL-адреса.

    Управление состоянием (State Management)

    Для управления состоянием в больших React-приложениях часто используют библиотеки, такие как Redux или Context API.

    * **Redux:** Централизованное хранилище состояния, которое позволяет компонентам получать доступ к состоянию и обновлять его.
    * **Context API:** Позволяет передавать данные между компонентами, не передавая их через каждый уровень компонентов.

    Выбор библиотеки для управления состоянием зависит от сложности вашего приложения. Для небольших приложений Context API может быть достаточно, а для больших приложений Redux может быть более подходящим.

    Тестирование (Testing)

    Тестирование – важная часть разработки React-приложений. Существует несколько библиотек для тестирования React-компонентов:

    * **Jest:** Фреймворк для тестирования, разработанный Facebook.
    * **Enzyme:** Библиотека для тестирования React-компонентов, разработанная Airbnb.
    * **React Testing Library:** Библиотека для тестирования React-компонентов, которая фокусируется на тестировании поведения пользователя.

    **Пример тестирования React-компонента с использованием React Testing Library:**

    javascript
    import React from ‘react’;
    import { render, screen } from ‘@testing-library/react’;
    import MyComponent from ‘./MyComponent’;

    test(‘renders hello world’, () => {
    render();
    const linkElement = screen.getByText(/hello world/i);
    expect(linkElement).toBeInTheDocument();
    });

    Заключение

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

    Дополнительные ресурсы

    * **Официальный сайт React:** [https://reactjs.org/](https://reactjs.org/)
    * **Create React App:** [https://create-react-app.dev/](https://create-react-app.dev/)
    * **React Router:** [https://reactrouter.com/](https://reactrouter.com/)
    * **Redux:** [https://redux.js.org/](https://redux.js.org/)
    * **React Testing Library:** [https://testing-library.com/](https://testing-library.com/)

    0 0 votes
    Article Rating
    Subscribe
    Notify of
    0 Comments
    Oldest
    Newest Most Voted
    Inline Feedbacks
    View all comments