Невозможно отобразить данные из API

У меня есть несколько графиков (сделанных с помощью Graph js), и я хочу отобразить в них данные.

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

const API = 'http://127.0.0.1:5000/models/';
const DEFAULT_QUERY = 'Vno';

class App extends Component {
    constructor(props) {
        super(props);
        this.state = {
            chartData: {},
            hits: [],
            isLoading: false,
            error: null
        };
    }

    getChartData() {
        const hits = this.state;
        const nextMonths = ['February', 'March', 'April', 'June', 'July', 'August', 'September', 'October'];

        this.setState({
            chartData: {
                labels: hits.pha,
                datasets: [
                    {
                        label: 'Dataset',
                        fill: false,
                        lineTension: 0.1,
                        backgroundColor: ['rgba(243, 129, 129, 0.4)', 'rgba(75,192,192,0.4)',
                            'rgba(249, 237, 105, 0.4)',
                            'rgba(184, 59, 94, 0.4)',
                            'rgba(106, 44, 112, 0.4)',
                            'rgba(0, 184, 169, 0.4)',
                            'rgba(135, 133, 162, 0.4)'],
                        borderColor: '#fae3d9',
                        borderCapStyle: 'butt',
                        borderDash: [],
                        borderDashOffset: 0.0,
                        borderJoinStyle: 'miter',
                        pointBorderColor: '#212121)',
                        pointBackgroundColor: '#252a34',
                        pointBorderWidth: 3,
                        pointHoverRadius: 5,
                        pointHoverBackgroundColor: 'rgba(75,192,192,1)',
                        pointHoverBorderColor: 'rgba(220,220,220,1)',
                        pointHoverBorderWidth: 2,
                        pointRadius: 5,
                        pointHitRadius: 10,
                        data: [50, 30, 40, 60]
                    }
                ],
            }
        })
    }

    componentDidMount() {
        this.setState({ isLoading: true });
        fetch(API + DEFAULT_QUERY)
            .then(response => {
                if (response.ok) {
                    return response.json();
                } else {
                    throw new Error('Something went wrong ...');
                }
            })
            .then(data => this.setState({ hits: data.hits, isLoading: false }))
            .catch(error => this.setState({ error, isLoading: false }));
    }

    componentWillMount() {
        this.getChartData();
    }

    render() {
        const { hits, isLoading, error } = this.state;
        if (error) {
            return <p>{error.message}</p>;
        }

        if (isLoading) {
            return <div className = "react-spinner">
                <MDSpinner size = {100} />
            </div>
        }
        return (
            <div className = "App">
                <Navbar bg = "light" variant = "light">
                    <Navbar.Brand href = "#">Aeroconseil</Navbar.Brand>
                    <Nav className = "mr-auto">
                    </Nav>
                </Navbar>
                <hr className = "hr-line"></hr>
                <div className = "container">
                    <Chart chartData = {this.state.chartData} />
                    <LineGraph chartData = {this.state.chartData} />
                    <ul>
                        {hits.map(hit =>
                            <li key = {hit.name}>
                                <a>{hit.pha}</a>
                            </li>
                        )}
                    </ul>
                </div>

            </div>
        );
    }
}

export default App;

Я ожидал, что данные из API будут отображаться, но он говорит, что не определено.

Я не уверен, что видел API, которые возвращают функции. Я имею в виду, response.json() может быть виновником

cr05s19xx 06.02.2019 14:37

Кажется, это не из response.json(), и он возвращает обещание, поэтому я не думаю, что это проблема.

user8283004 06.02.2019 15:06

Попробуйте использовать const {hits} = this.state вместо const hits = this.state, поскольку вы пытаетесь получить доступ к свойству в объекте.

a2441918 06.02.2019 15:17

Хорошо, он по-прежнему говорит, что он пуст, но идея в render() после его регистрации показывает данные, но в компоненте getChartData() для того же объекта он показывает, что он пуст.

user8283004 06.02.2019 15:23

Я понимаю. Это потому, что вы вызываете метод в componentWillMount, который в основном является конструктором. Вы делаете вызов API в componentDidMount, который является следующим жизненным циклом. Поэтому вызовите свой метод в componentDidMount после получения ответа API и сообщите, если он все еще не показывает вам данные.

a2441918 06.02.2019 15:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Несколько вещей, которые могут быть проблематичными:

  1. в первой строке определения getCharData вы должны использовать деструктурирование, поэтому это должно быть
getCharData() {
  const { hits } = this.state;
  // ...
}
  1. метод жизненного цикла componentWillMount был устарел в React 16.3 и был заменен на UNSAFE_componentWillMount, и, возможно, поэтому вы получаете undefined

  2. в React Обновления состояния могут быть асинхронными, поэтому вместо этого вы можете попробовать использовать метод жизненного цикла componentDidUpdate

componentDidUpdate() {
  this.getCharData();
}
Ответ принят как подходящий

Мне удалось это исправить. Я не думаю, что это хорошее решение, но если у кого-то есть какие-то идеи или проблема похожа на мою. (Мне не нужно было вызывать hits для getChartData() или вызывать его для render() const.)

let hit_labels = []
      let hit_values = []

      for(let item in this.state.hits){
        hit_labels.push(this.state.hits[item].name);
        let value = parseInt(this.state.hits[item].pha);

        hit_values.push(isNaN(value) ? 0 : value);
      }

      this.state.chartData.labels = hit_labels;
      this.state.chartData.datasets[0].data = hit_values;
      console.info(this.state.chartData);

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