Изучите основы React, создав крошечное приложение за считанные минуты.

React - очень популярная библиотека JavaScript, созданная Facebook и используемая многими другими лидерами отрасли, такими как Netflix, Airbnb и т. Д. Это библиотека для создания пользовательских интерфейсов. Он вводит много новых концепций о том, как подходить к созданию сложных пользовательских интерфейсов. Мы рассмотрим основные концепции создания приложений с помощью React. Мы коснемся всех основ, которые вам нужно знать, чтобы начать чувствовать себя комфортно с React.

Примечание. Я буду использовать некоторый синтаксис ES6 +, включая class , arrow functions , const , let, import, export и т. д. Я предлагаю вам пройти Введение в ES6, если вы не знакомы с новым обновленным синтаксисом. Мы пропустим установку всех инструментов сборки благодаря Codesandbox - он дает вам готовую среду разработки прямо в вашем браузере.

Начиная

Для начала зайдите в Codesandbox и создайте новую песочницу React. Создав его, откройте index.js и Hello.js в каталоге src и удалите весь существующий код. Это просто для того, чтобы у нас был чистый лист для начала.

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

Если вы хотите поиграть с готовым кодом, вот ссылка на приложение -



Компонент First React

Все в React является компонентом. Итак, давайте напишем наш первый компонент, и это будет компонент «Hello World». Никаких сюрпризов !!

Перейдите в index.js в каталоге src и напишите следующий код -

import React from 'react';
import ReactDOM from 'react-dom';
class HelloWorld extends React.Component {
    render() {
        return <div>Hello World</div>;
    }
}
ReactDOM.render(<HelloWorld/>, document.getElementById('root'));

Вот и все, вы создали свой первый компонент React. Он отображает <div>, говорящий "Hello World". Давайте пройдемся по только что написанному коду.

Сначала мы импортируем React из пакета react. Нам нужно это, чтобы иметь возможность создать класс компонента HelloWorld, поскольку, как вы видите, он расширяет React.Component. Также он нам понадобится для написания JSX.

Во-вторых, мы импортируем ReactDOM из пакета react-dom. Нам это нужно, чтобы смонтировать приложение React к элементу DOM в html. Посмотрите на самую последнюю строку, мы используем метод ReactDOM.render для монтирования нашего приложения (в нашем случае это просто компонент HelloWorld) в элементе DOM с id из “root”. Если вы проверите index.html в общедоступном каталоге, вы заметите, что в нем есть <div> с id="root". «Монтирование» означает, что наши реагирующие приложения отображаются как дочерний узел <div> с id="root".

Теперь поговорим о Компоненте. В качестве реакции мы можем создать Компонент, создав class, который расширяет класс React.Component. И каждый компонент React должен иметь render метод. Этот метод render и метод ReactDOM.render не связаны между собой, поэтому не путайте их. Метод render возвращает то, что компонент должен отображать в DOM. В нашем случае это простой <div> с некоторым текстом. Вы заметите, что возвращаемое значение выглядит как HTML и не заключено в ""или ``. Следовательно, это не строка. Это то, что мы называем JSX. JSX выглядит как HTML и используется для упрощения создания контента для рендеринга.

JSX - не что иное, как синтаксический сахар для React.createElement вызовов. JSX может содержать любой допустимый HTML (с некоторыми изменениями, такими как - className вместо атрибута class и атрибуты обработчика событий camelCased, например, onChange вместо onchange), другие компоненты React, выражения JS и многое другое. Узнайте больше о JSX здесь. Пока этого достаточно.

Реквизит и состояние

Существует два наиболее распространенных способа обработки данных в React - Props и State.

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

Давайте посмотрим, как мы можем использовать Props -

Откройте index.js и внесите следующие изменения (изменения выделены жирным шрифтом) -

import React from 'react';
import ReactDOM from 'react-dom';
import Hello from './Hello';
class App extends React.Component {
    render() {
        return <Hello name="World"/>;
    }
}
ReactDOM.render(<App/>, document.getElementById('root'));

Сейчас мы импортируем компонент Hello из файла Hello.js в том же локальном каталоге. Мы изменили оператор return JSX, чтобы использовать компонент Hello. Мы используем атрибут name со значением "World". name является опорой для компонента Hello. Мы можем получить доступ к переданному значению, используя опору name в компоненте Hello. Я также изменил имя основного компонента с HelloWorld на App.

Откройте Hello.js в каталоге src и напишите следующий код -

import React, { Component } from 'react';
class Hello extends Component {
    render() {
        return <h1>Hello {this.props.name}</h1>;
    }
}
export default Hello;

Здесь мы создаем новое имя компонента Hello, и оно возвращает <h1> с некоторым текстом.

Помните, что при использовании компонента Hello в компоненте App мы передали ему свойство name. Внутри компонента мы можем получить доступ к значению, переданному в свойство name, используя его как this.props.name. В этом случае значение будет "World". Таким образом, он закончится рендерингом "Hello World".

Наконец, мы используем export компонент по умолчанию, чтобы использовать его из index.js.

Давайте теперь воспользуемся State -

Откройте index.js и внесите следующие изменения (изменения выделены жирным шрифтом) -

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import Hello from './Hello';
import Form from './Form';
class App extends Component {
    state = {
        name: ''
    };
    
    _updateName = event => {
        const value = event.target.value;
        this.setState({ name: value });
    };
    render() {
        return (
            <div>
                <Hello name={this.state.name} />
                <Form updateNameHandler={this._updateName} />
            </div>
        );
    }
}
ReactDOM.render(<App />, document.getElementById('root'));

Сейчас мы импортируем еще один новый компонент - Form. Мы инициализируем state и метод с именем _updateName с использованием синтаксиса инициализатора свойств ES6. Итак, в этом случае state - это object со свойством name, установленным на '' (пустое строковое значение).

Мы передаем значение name из состояния в компоненте App в компонент Hello как свойство. Мы обращаемся к нему как this.state.name.

Теперь мы подошли к обновлению или изменению состояния. Пишем метод _updateName. Метод принимает один параметр event, который мы получим от обработчика событий onChange, который мы будем использовать внутри компонента Form. Мы получаем новый value из event.target.value и обновляем значение name в состоянии с ним.

В React у нас есть специальный API для обновления состояния, то есть this.setState. Он принимает объект или функцию в качестве первого параметра и необязательную функцию обратного вызова в качестве второго параметра. Если объект передается в качестве первого параметра, он использует неглубокое слияние объекта предыдущего состояния и переданного объекта для формирования нового объекта состояния. . Если передается функция (вызываемая как функция обновления), возвращаемое значение функции неглубоко объединяется с предыдущим объектом состояния , чтобы сформировать новое состояние. Кроме того, функция обновления получает предыдущее состояние как первый параметр и реквизиты как второй параметр. .

Мы сохраним простоту и воспользуемся объектом для обновления значения name как такового this.setState({ name: value }).

Примечание. Не забывайте обновлять состояние непосредственно в React, т.е. вот так this.state.name = value. Это не приведет к повторному рендерингу и возникновению неприятных ошибок. Единственное место, где вы можете назначить this.state, - это конструктор. Всегда используйте this.setState.

Затем мы используем новый компонент Form в функции render. Мы передаем _updateName функцию как updateNameHandler prop компоненту Form.

Теперь создайте файл в каталоге src с именем Form.js и напишите в нем следующий код -

import React from 'react';
export default props => (
    <input 
        type="text"
        name="name"
        onChange={props.updateNameHandler}
    />
);

Этот компонент выглядит иначе, чем App или Hello компонент. Это потому, что это функция-как-компонент, или более известный как компонент без состояния. Компонент, которому требуется только render функция, можно записать как function. Значение функции return - это то, что отображается точно так же, как значение return метода render в классе-как-компоненте или компоненте с отслеживанием состояния. Компонент без состояния не может иметь никаких перехватчиков состояния или жизненного цикла (подробнее об этом в промежуточном руководстве).

Чтобы обработать событие изменения в элементе ввода, мы присоединяем функцию updatNameHandler из реквизита к атрибуту onChange ввода. React использует так называемые синтетические события для обработки событий, поэтому на onchange это onChange.

event передается методу _updateName в App, оттуда мы получаем значение и обновляем this.state.name в App, который затем передает обновленное значение this.state.name как name реквизиты в Hello, который отображает новый вывод «Hello».

Таким образом, наше приложение готово. Он показывает «Hello» в начале, и когда пользователь вводит свое имя во вводе, он добавляет свое имя после «Hello».



Заключение

Поздравляем с созданием приложения React. Вы изучили основные концепции React и некоторые другие с помощью этого крошечного приложения за считанные минуты. Если вам понравилась эта статья, пожалуйста, аплодируйте, делитесь, комментируйте. Я скоро напишу статью среднего уровня по React.

А пока посмотрите эти, чтобы узнать больше -

Официальная документация React

Руководство по ReactJS для новичков