变量在重新渲染后会丢失其所有数据

时间:2020-05-10 17:06:56

标签: javascript reactjs charts

我有一个React项目,该项目利用Chart JS根据数据绘制图表。 我有一个下拉列表选择器,可以从中选择要绘制的数据集。但是,在切换到另一个数据集然后又切换回初始渲染的数据集之后,它似乎不再起作用。这是我的代码:

import React from 'react';
import { Line } from 'react-chartjs-2';
import { chartData } from './Search.js';
import { xLabels } from './Search.js';
import { allEpsData } from './Search.js';

let chartDataSeason = [];
let xLabelsSeason = [];

export class Graph extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      selectValue: '',
      seasonSelected: false,
      chartIt: {
        labels: xLabels,
        datasets: [
          {
            label: 'Rating',
            data: chartData,
            fill: false,
            borderColor: '#00B4CC',
          },
        ],
      },
      chartItSeason: {
        labels: xLabelsSeason,
        datasets: [
          {
            label: 'Rating',
            data: chartDataSeason,
            fill: false,
            borderColor: '#00B4CC',
          },
        ],
      },
    };
    this.handleChange = this.handleChange.bind(this);
  }
  handleChange(e) {
    if (e.target.value === 'All Seasons') {
      this.setState({
        seasonSelected: false,
        chartIt: {
          labels: xLabels,
          datasets: [
            {
              label: 'Rating',
              data: chartData,
              fill: false,
              borderColor: '#00B4CC',
            },
          ],
        },
      });
      console.log(chartData);
    } else {
      chartDataSeason = [];
      xLabelsSeason = [];
      let seasonNum = e.target.value.slice(6);

      for (let i = 0; i < allEpsData[seasonNum - 1].length; i++) {
        chartDataSeason.push(allEpsData[seasonNum - 1][i].imdbRating);
        xLabelsSeason.push(
          `s${seasonNum}e${allEpsData[seasonNum - 1][i].Episode} "${
            allEpsData[seasonNum - 1][i].Title
          }"`
        );
      }

      this.setState({
        selectValue: e.target.value,
        seasonSelected: true,
        chartItSeason: {
          labels: xLabelsSeason,
          datasets: [
            {
              label: 'Rating',
              data: chartDataSeason,
              fill: false,
              borderColor: '#00B4CC',
            },
          ],
        },
      });
    }
    // console.log(chartDataSeason)
  }
  render() {
    let seasons = [];
    for (let i = 0; i < allEpsData.length; i++) {
      seasons.push(i);
    }

    if (this.state.seasonSelected === false) {
      return (
        <div>
          <select // selector
            className="select"
            value={this.state.selectValue}
            onChange={this.handleChange}
          >
            <option>All Seasons</option>
            {seasons.map((el) => {
              return <option key={el}>season {el + 1}</option>;
            })}
          </select>
          <div className="line-container">
            <Line
              data={this.state.chartIt}
              width={600}
              height={400}
              options={{
                maintainAspectRatio: false,
                scales: {
                  xAxes: [
                    {
                      ticks: {
                        display: true, //this will remove only the label
                      },
                      gridLines: {
                        show: false,
                        display: false,
                      },
                    },
                  ],
                  yAxes: [
                    {
                      gridLines: {
                        show: false,
                        drawBorder: false,
                      },
                    },
                  ],
                },
                animation: {
                  duration: 200,
                  easing: 'easeInOutQuart',
                },
                tooltips: {
                  enabled: true,
                },
              }}
            />
          </div>
          <div className="seasons-graph-container"></div>
        </div>
      );
    } else {
      return (
        <div>
          <select
            className="select"
            value={this.state.selectValue}
            onChange={this.handleChange}
          >
            <option>All Seasons</option>
            {seasons.map((el) => {
              return <option key={el}>season {el + 1}</option>;
            })}
          </select>
          <div className="line-container">
            <Line
              data={this.state.chartItSeason}
              width={600}
              height={400}
              options={{
                maintainAspectRatio: false,
                scales: {
                  xAxes: [
                    {
                      ticks: {
                        display: false, //this will remove only the label
                      },
                      gridLines: {
                        show: false,
                        display: false,
                      },
                    },
                  ],
                  yAxes: [
                    {
                      gridLines: {
                        show: false,
                        drawBorder: false,
                      },
                    },
                  ],
                },
                animation: {
                  duration: 200,
                  easing: 'easeInOutQuart',
                },
                tooltips: {
                  enabled: true,
                },
              }}
            />
          </div>
          <div className="seasons-graph-container"></div>
        </div>
      );
    }
  }
}

问题出在chartData上,它没有正确地重新呈现-与之关联的所有数据已被最后一个菜单项的数据替换。但是奇怪的是,xLabels确实可以正确呈现。什么都没有改变chartDataxLabels的值,但只有xLabels得到正确更新。我在这里想念什么吗?提前为意大利面条式代码道歉,我仍在学习React!

0 个答案:

没有答案