Официальный Highcharts + React, популяция серии из JSON?

У меня возникли проблемы с заменой текущего графика в проекте на Highcharts. Я использую NPM-пакеты highcharts-response-official (и highcharts), и он не отображает "все" из ответа.

Проект довольно большой, и, глядя на реализацию старой диаграммы, он кажется довольно простым с Rechart. Текущая выборка данных из ответа API выглядит примерно так (в оболочке ComposedChart):

data = {chartData}

Которая затем отображает все необходимые данные. Я надеялся, что это будет простой обмен и заполнение Highcharts таким же образом, но это было не так.

В методе возврата у меня это:

<HighchartsReact
 highcharts = {Highcharts}
 options = {options}
/>

И мои варианты в методе рендеринга у меня следующие:

const options = {

  chart: {
    events: {
        load: function () {
          console.info(JSON.stringify(chartData[2].value))
        }
      }
    },
  title: {
    text: ''
  },
  series: {
        name: 'test',
        data: chartData
  }

Такого рода работы. Журнал консоли печатает конкретное значение, но если я попробую его в серии, например data: chartData [2] .value, это не сработает. При использовании data: chartData он ДЕЙСТВИТЕЛЬНО отображает правильное количество записей из объекта в виде категорий (в данном случае 6 разных записей), но не более того. Это неправильно разбирается или в чем дело?

Спасибо!

-

Обновлено:

Хорошо, вот как это выглядит сейчас, и вроде как работает.

chart: {
    events: {
      load: () => {
        this.state.testChart.map(data =>
        testData.push({
          name: data.time,
          x: data.temp,
          y: data.value
        })
      );
        this.setState({ data: testData });
      }
    }
  },

И в моей серии:

  series: [{
    type: 'column',
    name: 'Current year',
    data: testData
  },

Визуальный результат состоит в том, что Highcharts добавляет все 6 объектов в массив, который мне дает ответ (показывает 6 категорий). Но не отображает никаких данных из этих 6 записей. Это выглядит примерно так:

[
 {time: "2018-10-11", temp: "21", value: "10"}, 
 {time: "2018-10-10", temp: "12", value: "31"}
]

В то же время, когда изменяется временной интервал (например, нажатие кнопки, чтобы показать предыдущую неделю, которая обрабатывает testChart вне HC), эти 6 записей (и, следовательно, категории в HC) изменяются, как и ожидалось. Так что это похоже на то, как мне нужно идти, но как мне сделать данные видимыми? Что мне не хватает?

Привет, mtorn, Что касается вашего редактирования, значения в данных должны быть числами, а не строками.

ppotaczek 10.10.2018 15:13

Я попробовал быстро преобразовать их в ответ в методе testData.push, например x: Number (data.temp), что не помогло.

mtorn 11.10.2018 09:56

Привет, mtorn, не могли бы вы подготовить минимальный живой пример?

ppotaczek 11.10.2018 10:39

Я сделал быстрый пример, но он не работает полностью, но, возможно, вы его поняли. codeandbox.io/s/5m99q7nkp

mtorn 11.10.2018 10:50

Привет, mtorn, Спасибо за пример, теперь намного проще посмотреть на проблему. Вы не можете конвертировать данные в событии load, потому что они находятся до загрузки. Живая демонстрация: codeandbox.io/s/q3z4k1k9yw

ppotaczek 11.10.2018 11:42

Ооооо, я вижу! Ага, это больше похоже на это! Вы знаете, как я могу обновить вызов при нажатии на кнопку? Например, testChart уже извлекает данные из другого метода в скрипте и после щелчка по нему обновляет testChart новыми значениями. Но на данный момент Highcharts, похоже, не реагирует на обновление. Это потому, что он установлен внутри функции загрузки события и срабатывает только один раз?

mtorn 11.10.2018 12:39

Да, событие load срабатывает только один раз, вы можете прочитать о событиях диаграммы в API: api.highcharts.com/highcharts/chart.events Вот пример того, как вы можете получить данные и обновить диаграмму после нажатия кнопки: codeandbox.io/s/q3z4k1k9ywcodeandbox.io/s/q3z4k1k9yw

ppotaczek 11.10.2018 13:49
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
7
1 050
1

Ответы 1

Вероятно, вы пытаетесь создать график, когда данные еще не загружены. Взгляните на пример ниже, вы можете увидеть, как создать диаграмму с динамическими данными:

class App extends React.Component {
  constructor(props) {
    super(props);
  }

  componentDidMount() {
    fetch("https://api.myjson.com/bins/q4us4")
      .then(response => response.json())
      .then(data => {
        options.series[0].data = data;
        this.setState({ data: data });
      });
  }

  render() {
    return (
      <div>
        {this.state &&
          this.state.data && (
            <Chart options = {options} highcharts = {Highcharts} ref = {"chart"} />
          )}
      </div>
    );
  }
}

render(<App />, document.getElementById("root"));

Живая демонстрация: https://codesandbox.io/s/mz35zwxjoj

Да, я придумал что-то в этом роде, но, похоже, это не помогает. Если я использую другой фиктивный JSON, он не заполнит диаграмму. См. Демонстрацию: codeandbox.io/s/n77117y1k0

mtorn 25.09.2018 11:39

Привет, mtorn, спасибо за пример, но он больше не работает. Я заметил, что у вас неправильный формат данных, посмотрите примеры в API: api.highcharts.com/highcharts/series.column.data

ppotaczek 25.09.2018 15:17

О, я вижу. Что ж, в этой ссылке тот же принцип, просто переключайтесь между ними. codeandbox.io/s/6xm89n36m3 Я понимаю, что это не сработает из коробки, но нужно ли мне сильно манипулировать ответом, чтобы он соответствовал формату данных, который хочет HC, или что мне нужно сделать?

mtorn 25.09.2018 15:23

Да, вам нужно преобразовать свой ответ в формат, требуемый Highcharts, например, таким образом: codeandbox.io/s/wwym42z1q7

ppotaczek 25.09.2018 15:40

Отлично, работает! Спасибо. Но я понял, что при текущей настройке приложения это не работает. Он не выполняет повторный рендеринг при получении новых данных, например, при переключении временного интервала. Я создам новый пост в этой теме с дополнительной информацией.

mtorn 10.10.2018 10:24

Я обновил первый пост, если вы не против взглянуть.

mtorn 10.10.2018 14:28

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