Search code examples
javascriptreactjschartsecmascript-6datakey

React DataKey in Charts


I am consuming data fixtures to fill the charts built with Recharts

I have two objects in my data: Finances and DAU

const charts = [
  {
    name: 'Finances',
    data:[
      {name: 'April', Balance: 48530, saving: 0},
      {name: 'May', Balance: 50328, saving: 1798},
      {name: 'June', Balance: 48573, saving: -1755},
      {name: 'July', Balance: 48825, saving: 252}
    ]
  },
  {
    name: 'DAU',
    data: [
      {Day: '2016-10-28', Android: 27, iOS: 12},
      {Day: '2016-10-29', Android: 20, iOS: 17},
      {Day: '2016-10-30', Android: 17, iOS: 13},
      {Day: '2016-10-31', Android: 15, iOS: 13},
      {Day: '2016-11-01', Android: 14, iOS: 11}
    ]
  }
];

export default charts;

At the moment i am passing the datakey only for the first data object ( Finance )

for <XAxis dataKey="name"/> and the two lines component <Line type="monotone" dataKey="Balance"/> and <Line type="monotone" dataKey="saving"/>

This is my chart component

export default class Chart extends React.Component {
  render () {
    const { chart, i } = this.props;
    return (
      <div>
        <h1>{chart.name}</h1>
        <LineChart width={600} height={300} data={chart.data}
              margin={{top: 5, right: 30, left: 20, bottom: 5}}>
         <XAxis dataKey="name"/>
         <YAxis/>
         <CartesianGrid strokeDasharray="3 3"/>
         <Tooltip/>
         <Legend />
         <Line type="monotone" dataKey="Balance" stroke="#82ca9d" />
         <Line type="monotone" dataKey="saving" stroke="#8884d8" activeDot={{r: 8}}/>
        </LineChart>
      </div>
    );
  }
};

How can i pass the dataKey dynanmically in my XAxis and Lines components for the 2 objects Finances and DAU ?


Solution

  • I would add the keys to the chart objects and use them as props inside the Chart component. Like so:

    const charts = [
      {
        name: 'Finances',
        xAxisKey: 'name',
        line1Key: 'Balance',
        line2Key: 'saving',    
        data:[
          {name: 'April', Balance: 48530, saving: 0},
          {name: 'May', Balance: 50328, saving: 1798},
          {name: 'June', Balance: 48573, saving: -1755},
          {name: 'July', Balance: 48825, saving: 252}
        ]
      },
      {
        name: 'DAU',
        xAxisKey: 'Day',
        line1Key: 'Android',
        line2Key: 'iOS',  
        data: [
          {Day: '2016-10-28', Android: 27, iOS: 12},
          {Day: '2016-10-29', Android: 20, iOS: 17},
          {Day: '2016-10-30', Android: 17, iOS: 13},
          {Day: '2016-10-31', Android: 15, iOS: 13},
          {Day: '2016-11-01', Android: 14, iOS: 11}
        ]
      }
    ];
    

    And the component:

    export default class Chart extends React.Component {
      render () {
        const { chart, i } = this.props;
        return (
          <div>
            <h1>{chart.name}</h1>
            <LineChart width={600} height={300} data={chart.data}
                  margin={{top: 5, right: 30, left: 20, bottom: 5}}>
             <XAxis dataKey={chart.xAxisKey} />
             <YAxis/>
             <CartesianGrid strokeDasharray="3 3"/>
             <Tooltip/>
             <Legend />
             <Line type="monotone" dataKey={chart.line1Key} stroke="#82ca9d" />
             <Line type="monotone" dataKey={chart.line2Key} stroke="#8884d8" activeDot={{r: 8}}/>
            </LineChart>
          </div>
        );
      }
    };