Как отправить массив объекта в качестве реквизита? - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть состояние, которое представляет собой объект, содержащий массив, и этот массив содержит объект, который выглядит примерно так [{"tone":"negative","value":0},{"tone":"neutral","value":91},{"tone":"positive","value":9}].

Итак, я хочу построить гистограмму, используя только значения из этого массива объектов. Я хочу отправить эти значения другому компоненту, который можно использовать для динамического построения гистограмм. Но я не уверен, как это сделать. Может кто-нибудь показать, как отправить значения в компонент Barchart и использовать их также в Barchart?

Это код

state={
    analysis: {
      tonal: [],
      anxiety: []
    }
}
Analysis = async () => {
    //some api call

      const {
        ...tonalAnalysis
      } = result.scores;

      const tonalArray = Object.entries(tonalAnalysis).reduce(
        (carry, [tone, value]) => [
          ...carry,
          { tone: tone.toLowerCase(), value: parseInt(value) }
        ],
        []
      );

      this.setState({
        analysis: { ...this.state.analysis, tonal: tonalArray }
      });
      console.log("Tonal array" + JSON.stringify(this.state.analysis.tonal)); //console logs `[{"tone":"negative","value":0},{"tone":"neutral","value":91},{"tone":"positive","value":9}]`
  };

render(){
    return {
      <BarCharts/> // confused how to send the values as props here
}

компонент гистограммы, где я буду использовать

import React from "react";

import { Bar } from "react-chartjs-2";

import "./App.css";

class BarCharts extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: {
        labels: [
          negative,
          neutral,
          positive
        ],
        datasets: [
          {
            label: "Value plotting",
            backgroundColor: "rgba(255,99,132,0.2)",
            borderColor: "rgba(255,99,132,1)",
            borderWidth: 1,
            hoverBackgroundColor: "rgba(255,99,132,0.4)",
            hoverBorderColor: "rgba(255,99,132,1)",
            data: [65, 59, 80, 81, 56, 55, 40] //want to use the values here dynamically. Don't want these static values
          }
        ]
      }
    };
  }

  render() {
    const options = {
      responsive: true,
      legend: {
        display: false
      },
      type: "bar"
    };
    return (
      <Bar
        data={this.state.data}
        width={null}
        height={null}
        options={options}
      />
    );
  }
}

export default BarCharts;

Ответы [ 3 ]

1 голос
/ 26 февраля 2020

Просто добавьте желаемый реквизит в объявлении компонента:

<BarCharts data={this.state.analysis}/> 

И на вашем BarChart компоненте вам нужно будет просто извлечь значения из ваших массивов, это на всякий случай, если вам нужна такая же структура :

...
this.state = {
      data: {
        labels: [
          negative,
          neutral,
          positive
        ],
        datasets: [
          {
            label: "Value plotting",
            backgroundColor: "rgba(255,99,132,0.2)",
            borderColor: "rgba(255,99,132,1)",
            borderWidth: 1,
            hoverBackgroundColor: "rgba(255,99,132,0.4)",
            hoverBorderColor: "rgba(255,99,132,1)",
            data: extractValues(this.props.data)
          }
        ]
      }
...
//This method can be reused in a hook or in a lifecycle method to keep data updated.
const extractValues = (data) => {
  return data.map( d => d.value);
}
1 голос
/ 26 февраля 2020

Вы можете создать компонент-обертку HighChart, который можно использовать для любых графиков Highchart.

Примечание: - каждый раз, когда изменяется набор данных, вам нужно уничтожать и заново визуализировать график, чтобы сделать график отражает изменения.


// @flow
import * as React from "react";
import merge from "lodash/merge";
import Highcharts from "highcharts";
import isEqual from "lodash/isEqual";

export type Props = {
    config?: Object,
    data: Array<any>,
    onRendered?: () => void
};

class HighchartWrapper extends React.PureComponent<Props> {
    container: ?HTMLElement;

    chart: any;

    static defaultProps = {
        config: {},
        onRendered: () => {}
    };

    componentDidMount() {
        this.drawChart(this.props);
    }

    componentWillReceiveProps(nextProps: Props) {
        const data= [...this.props.data];

        if (!isEqual(nextProps.config, this.props.config) || !isEqual(nextProps.data, data)) {
            this.destroyChart();
            this.drawChart(nextProps);
        }
    }

    destroyChart() {
        if (this.chart) { 
           this.chart.destroy();
        }
    }

    componentWillUnmount() {
        this.destroyChart();
    }

    drawChart = (props: Props) => {
        const { config: configProp, data, onRendered } = props;
        if (this.container) {
            let config = merge({}, configProp);

            this.chart = new Highcharts.chart(this.container, { ...{ ...config, ...{ series: [...data] } } }, onRendered);
        }
    };

    render() {
        return <div ref={ref => (this.container = ref)} />;
    }
}

export default HighchartWrapper;

Чтобы использовать его для BarChart, просто передайте соответствующий конфиг гистограммы.


<HighchartWrapper config={{
  chart: {
        type: "bar"
    }
  }}
  data={[]}
>

Редактировать

import React from "react";
import BarChart from "./BarChart";

export default function App() {
  return (
    <div style={{ width: 400, height: 840 }}>
      <BarChart
        config={{
          chart: {
            height: 840,
            type: "bar"
          },
          xAxis: {
            categories: ["Positive", "Neutral", "Negative" ],
            title: {
              text: null
            }
          },
          yAxis: {
            min: 0,
            title: {
              text: "Population (millions)",
              align: "high"
            },
            labels: {
              overflow: "justify"
            }
          }
        }}
        data={[
          {
            name: "Series Name",
            data: [90, 9, 10]
          }
        ]}
      />
    </div>
  );
}

0 голосов
/ 26 февраля 2020

Вы можете отобразить массив так, чтобы ваш код был:

state={
    analysis: {
      tonal: [],
      anxiety: []
    }
}
Analysis = async () => {
    //some api call

      const {
        ...tonalAnalysis
      } = result.scores;

      const tonalArray = Object.entries(tonalAnalysis).reduce(
        (carry, [tone, value]) => [
          ...carry,
          { tone: tone.toLowerCase(), value: parseInt(value) }
        ],
        []
      );

      this.setState({
        analysis: { ...this.state.analysis, tonal: tonalArray }
      });
      console.log("Tonal array" + JSON.stringify(this.state.analysis.tonal)); //console logs `[{"tone":"negative","value":0},{"tone":"neutral","value":91},{"tone":"positive","value":9}]`
  };

render(){
    return {
      <BarCharts values={this.state.analysis.tonal.map((entry) => entry.value)}/> // confused how to send the values as props here
}

И ваш столбец был бы:

import React from "react";

import { Bar } from "react-chartjs-2";

import "./App.css";

class BarCharts extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: {
        labels: [
          negative,
          neutral,
          positive
        ],
        datasets: [
          {
            label: "Value plotting",
            backgroundColor: "rgba(255,99,132,0.2)",
            borderColor: "rgba(255,99,132,1)",
            borderWidth: 1,
            hoverBackgroundColor: "rgba(255,99,132,0.4)",
            hoverBorderColor: "rgba(255,99,132,1)",
            data: props.values //want to use the values here dynamically. Don't want these static values
          }
        ]
      }
    };
  }

  render() {
    const options = {
      responsive: true,
      legend: {
        display: false
      },
      type: "bar"
    };
    return (
      <Bar
        data={this.state.data}
        width={null}
        height={null}
        options={options}
      />
    );
  }
}

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