Как сделать опрос на React-Table

Я пытаюсь создать React-Table, которая может каждую секунду опрашивать удаленный сервер для получения новейших данных. Я просто следил за тем, что сделал автор в документе (https://react-table.js.org/#/story/server-side-data), и попытался интегрировать функцию опроса (setInterval) в «componentDidMount», но это НЕ ИСПОЛЬЗОВалось.

Сообщение об ошибке показывает, что при запуске «requestData» под «componentDidMount», «отфильтрованный» не определен, длина которого недоступна. Как я могу это исправить? Спасибо.

import React from 'react';
import _ from 'lodash'

import ReactTable from "react-table";
import 'react-table/react-table.css'


const requestData = (pageSize, page, sorted, filtered) => {
    return fetch(
        'http://127.0.0.1:5000/agent',
        { method: 'GET'}
    ).then( res => res.json()
    ).then( filteredData => {

        if (filtered.length) {
            filteredData = filtered.reduce((filteredSoFar, nextFilter) => {
                return filteredSoFar.filter(row => {
                    return (row[nextFilter.id] + "").includes(nextFilter.value);
                });
            }, filteredData);
        }

        const sortedData = _.orderBy(
            filteredData,
            sorted.map(sort => {
                return row => {
                    if (row[sort.id] === null || row[sort.id] === undefined) {
                        return -Infinity;
                    }
                    return typeof row[sort.id] === "string"
                        ? row[sort.id].toLowerCase()
                        : row[sort.id];
                };
            }),
            sorted.map(d => (d.desc ? "desc" : "asc"))
        );

        const res = {
            rows: sortedData.slice(pageSize * page, pageSize * page + pageSize),
            pages: Math.ceil(filteredData.length / pageSize)
        };

        return res;
    });
};


class AgentTable extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            data: [],
            pages: null,
//            loading: true,
        };
        this.fetchData = this.fetchData.bind(this);
    }

    fetchData(state, instance) {
//        this.setState({
//            loading: true
//        });
        requestData(
            state.pageSize,
            state.page,
            state.sorted,
            state.filtered
        ).then(res => {
            this.setState({
                data: res.rows,
                pages: res.pages,
//                loading: false,
            })
        })
    }

    componentDidMount() {
        setInterval(
            () => requestData(
                this.state.pageSize,
                this.state.page,
                this.state.sorted,
                this.state.filtered
            ).then(res => {
                this.setState({
                    data: res.rows,
                    pages: res.pages,
//                    loading: false,
                })
            }), 5000
        );
    }

    render() {
        const { data, pages, loading } = this.state;
        return (
            <div>
                <ReactTable
                    columns = {[
                        {
                            Header: "Agent ID",
                            accessor: "AGENTID"
                        },
                        {
                            Header: "Description",
                            accessor: "DESCRIPTION"
                        },
                        {
                            Header: "Domain",
                            accessor: "DOMAIN"
                        },
                        {
                            Header: "Register Time",
                            accessor: "REGTIME"
                        },
                        {
                            Header: "Status",
                            accessor: "STATUS"
                        },
                    ]}
                    manual // Forces table not to paginate or sort automatically, so we can handle it server-side
                    data = {data}
                    pages = {pages} // Display the total number of pages
                    loading = {loading} // Display the loading overlay when we need it
                    onFetchData = {this.fetchData} // Request new data when things change
                    filterable
                    defaultPageSize = {20}
                    className = "-striped -highlight"
                />
            </div>
        );
    }
}

export default AgentTable;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
844
1

Ответы 1

Во-первых, вам нужно понять, что такое обратный вызов onFetchData. Взято из документации, onFetchData:

This function is called at componentDidMount and any time sorting, pagination or filterting is changed in the table

Так что то, что вы пытаетесь достичь здесь, не сработает так, как пытались. Поскольку получение данных с удаленного сервера каждую секунду не является одним из условий, вызывающих обратный вызов onFetchData, вам следует попробовать другой подход.

Я разветвил пример React-TableSimple Table и добавил синхронизированные запросы данных здесь, это должно помочь вам начать работу.

Другие вопросы по теме