Как функционально загрузить новые данные для нескольких компонентов React - PullRequest
0 голосов
/ 27 декабря 2018

Я настоящий новичок в React / ES6, поэтому мой вопрос довольно прост.

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

Итак, вопрос в том, как вызывать функцию getData столько раз, сколько нужно отобразить компоненту, чтобы каждый граф имел собственные данные.

import React from 'react'
import { render } from 'react-dom'
import Highcharts from 'highcharts'
import HighchartsReact from 'highcharts-react-official'


const options = {
   table: 'Chart 1',
   chart: {
     type: 'line',
     zoomType: 'xy'
   },
   title: {
     text: 'Chart 1'
   },
   series: [{
     data: []
   }]
 }


 const Value = () =>
   <p>{options.series[0].data[options.series[0].data.length-1]}</p>

 const Highchart = () => 
   <HighchartsReact
     highcharts={Highcharts}
     options={options}
     updateArgs={[true, true, true]}
   />

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {counter: null};
  }

  render() {
    if (this.state.counter) {
      return (
        <Counter 
          counter={this.state.counter}
          onExit={() => this.setState({counter:null})}
        />
      )
    } else {
      return (
        <div>
          <h2>Pick a Counter</h2>
          <button onClick={() => this.setState({counter:'simplest'})}  >Run</button><br/>
        </div>
      )
    }
  }
}

const getData = (opt) => {
  const Url = 'http://80.211.209.99/randArray.php';
  fetch(Url)
  .then(data=>{
    return data.json()
  })
  .then(res=>{
    options.series[0].data = res;
    opt.setState({number: opt.state.number + 1});
    console.log(options);
  })
}

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = {number: 0};
  }
  componentDidMount() {
    this.interval = setInterval(() => {
      console.log(this.state.number, this.props.counter)
      getData(this);
    }, 3000);
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }

  render() {
    return (
      <div>
        <h1>{this.state.number}</h1>
        <button onClick={this.props.onExit}>Exit</button>
        <div className="tableDiv">
          <div className="chartDiv">
            <Highchart />
            <Value />
          </div>
          <div className="chartDiv">
            <Highchart />
            <Value />
          </div>
          <div className="chartDiv">
            <Highchart />
            <Value />
          </div>
          <div className="chartDiv">
            <Highchart />
            <Value />
          </div>
          </div>
      </div>
    )
  }
}
render(<App/>, document.getElementById('root'))

1 Ответ

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

Предполагая, что http://80.211.209.99/randArray.php возвращает массив объектов.

 class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.url = "http://80.211.209.99/randArray.php";
    this.state = { graphData: [] };
  }
  componentDidMount() {
    fetch(this.url)
      .then(data => {
        return data.json();
      })
      .then(res => {
        this.setState({ graphData: res });
      });
  }

  render() {
    const charts = this.state.graphData.map(graph => (
      <div key={graph.somekindifid} className="chartDiv">
        <Highchart {...passdatathatyouneedfromgraph} />
        <Value {...passdatathatyouneedfromgraph} />
      </div>
    ));

    return (
      <div>
        <h1>{this.state.number}</h1>
        <button onClick={this.props.onExit}>Exit</button>
        <div className="tableDiv">{charts}</div>
      </div>
    );
  }
}
render(<App />, document.getElementById("root"));

Просто убедитесь, что передали правильные реквизиты в Highchart & Value из графического объекта.

Надеюсь, я понялхорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...