Обновление React Data при изменении данных MySQL - PullRequest
0 голосов
/ 20 декабря 2018

Я создал приложение React, которое использует fetch() для файла маршрута на componentDidMount для построения данных в визуализированном компоненте.

Это прекрасно работает, но компонент React статичен, когдаданные в базе данных MySQL обновляются.

Как мне обновить компонент React с любыми изменениями при изменении данных в базе данных MySQL?Пожалуйста, посмотрите пример моего кода ниже.

Файл реагирования - response.js

class myComponent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            data: []
        }
    }

    // componentDidMount - When the component is mounted.
    componentDidMount() {

        // Retrieve project data from the database.
        fetch('/retrieve-data', {
            credentials: 'include'
        })
        .then((response) => {
            if (response.ok) {
                return response.json();
            } else {
                console.log('Error with session response');
            }
        })
        .then((result) => {

            // Set the state of data.
            this.setState({
                data: data
            })
        })
        .catch((error) => {
            console.log('Error: ', error);
        });
    }

    render() {
        return (
            <div>

                {/* Loop Data Array */}
                {this.state.data.map((thisData, k) => (
                    <div key={k}>
                        {thisData.field1}
                    </div>
                ))}

            </div>
        )
    }
}

Файл маршрута - retrieve-data.js

var express = require('express');
var router = express.Router();
var mysql = require('mysql');

var connection = mysql.createConnection({
    host: myHost,
    user: myUser,
    password: myPassword,
    database: myDatabase
})

router.get('/', function(req, res, next) {

    // Select data from the database.
    connection.query("SELECT * FROM database_table", function (error, resultData, fields) {

        // Send the result message back to the React application.
        res.send({resultData});
    });
});

module.exports = router;

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

Извиняюсь за этот вопрос, я очень новичок в React.Спасибо!

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Хотя вы можете использовать веб-сокеты, как предлагает @jonnyg, и на самом деле это более производительный подход, он требует знания веб-сокетов и изменений на сервере.

Более простой подходна стороне клиента можно реализовать систему опросов, в которой вы в основном продолжаете «запрашивать» у сервера данные каждые x секунд и смотрите, изменились ли они.

Вы можете сделать это, создав setIntervalтаймер, который будет делать ваш сетевой запрос каждые х секунд.

0 голосов
/ 20 декабря 2018

https://www.npmjs.com/package/socket.io

Вы можете использовать socket.io для передачи изменений.

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

0 голосов
/ 20 декабря 2018

Вы можете использовать веб-сокеты для отправки обновлений на ваш интерфейс.

Основной поток будет:

  1. Передача сообщения с вашего сервера на клиент React при изменении данных
  2. Прослушайте событие 'dataChanged' в React и обновите состояние React соответствующим образом при получении
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...