React.js. Начало работы. Часть 7 из 12

20.10.2019

Теги: AJAXJavaScriptReact.jsWeb-разработкаXmlHttpRequestКомпонентФреймворк

Работа с внешними данными

Чтобы приложение работало быстро, размер страницы должен быть как можно меньше. Важно быстро показать пользователю первый экран, а все остальное, что может потребоваться, можно подгрузить и позже. Либо сразу после загрузки первого экрана, либо в момент, когда пользователь начнет взаимодействовать со страницей.

Все это происходит без обновления страницы или потери состояния, в котором находится страница. Давайте напишем небольшое приложение, которое будет показывать пользователю IP-адрес компьютера. Это приложение после первоначальной загрузки будет выполнять AJAX-запрос, чтобы получить извне IP-адрес устройства.

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

> create-react-app ipaddress

Удаляем все содержимое директорий src и public. В директории public создаем файл index.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Ваш IP адрес</title>
</head>
<body>
    <div id="container"></div>
<body>
</html>

В директории src создаем файл index.js:

import React from 'react';
import ReactDOM from 'react-dom';
import IpAddressGetter from './IpAddressGetter';
import './index.css';

ReactDOM.render(
    <IpAddressGetter/>,
    document.getElementById('container')
);

В директории src создаем файл index.css:

body {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    margin: 0;
    background: #FFCC99;
    font-family: Arial, Helvetica, sans-serif;
    text-align: center;
}

Далее нам нужно создать компонент IpAddressGetter, задача которого — получение IP-адреса от веб-сервиса, сохранения его в виде состояния, а затем предоставление этого состояния в качестве свойства любому компоненту, которому оно потребуется. Итак, создаем файл IpAddressGetter.js:

import React, {Component} from 'react';

class IpAddressGetter extends Component {
    render() {
        return (
            <span>Здесь будет IP-адрес</span>
        );
    }
}

export default IpAddressGetter;

Чтобы проверить работу приложения, переходим в директорию ipaddress и выполняем команду:

> npm start

Хорошо, теперь добавим код, который будет получать IP-адрес и сохранять его в состоянии:

import React, {Component} from 'react';

var xhr;

class IpAddressGetter extends Component {
    constructor(props) {
        super(props);
        this.state = {
            ip_address: '...'
        }
        this.processRequest = this.processRequest.bind(this);
    }

    componentDidMount() {
        xhr = new XMLHttpRequest();
        xhr.open('GET', 'https://api.ipify.org?format=json', true);
        xhr.send();

        xhr.addEventListener('readystatechange', this.processRequest, false);
    }

    processRequest() {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var response = JSON.parse(xhr.responseText);
            this.setState({
                ip_address: response.ip
            });
        }
    }

    render() {
        return (
            <span>{this.state.ip_address}</span>
        );
    }
}

export default IpAddressGetter;

Если мы сейчас проверим работу приложения, то увидим, что все работает как надо:

Но не хватает оформления для вывода результатов работы. Создадим еще один компонент, задача которого — исключительно оформление:

import React, {Component} from 'react';

class IpAddressWrapper extends Component {
    render() {
        return (
            <div>
                <p>Это ваш IP-адрес</p>
                <h1>{this.props.ip_address}</h1>
            </div>
        );
    }
}

export default IpAddressWrapper;

Теперь компонент IpAddressGetter больше не показывает IP-адрес, а вызывает для этого IpAddressWrapper:

import React, {Component} from 'react';
import IpAddressWrapper from './IpAddressWrapper';

var xhr;

class IpAddressGetter extends Component {
    /* .......... */
    render() {
        return (
            <IpAddressWrapper ip_address={this.state.ip_address} />
        );
    }
}

Поиск: AJAX • JavaScript • React.js • Web-разработка • XmlHttpRequest • Компонент • Фреймворк

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.