javascript - 如何在 React 中将数据传递给 Chart.js 图表

标签 javascript reactjs

我正在做一个项目,在这个项目中,你可以输入一周内花费的金额(我有杂货、购物、健康和家庭需求输入),它会计算总金额,并将其添加到零件。该项目的另一个功能是使用 Chart.js 制作的图表,它应该显示在杂货、购物、健康和家庭需求方面花费的金额。但是我在这部分遇到了麻烦。我试图通过 Prop 传递存储在受控输入中的数据,但数据未显示在图表中。有人可以帮我吗?这是代码:

 import React from "react";

import Header from "./Header";
import InputComponent from "./InputComponent";
import AmountCard from "./AmountCard";

import BillChart from "./BillsChart";

class SpendsApp extends React.Component {
constructor(props) {
 super(props);
 this.state = {
   groceries: 10,
   shopping: 0,
   health: 0,
   houseNeeds: 0,
   total: 0,
   chartData: []
 };
 this.handleChange = this.handleChange.bind(this);
 this.handleSubmit = this.handleSubmit.bind(this);
}

handleChange(e) {
 const { name, value } = e.target;
 this.setState({
   [name]: value
 });
}

handleSubmit(e) {
 const { groceries, shopping, health, houseNeeds } = this.state;

 const gSum = parseInt(groceries, 10);
 const sSum = parseInt(shopping, 10);
 const hSum = parseInt(health, 10);
 const hnSum = parseInt(houseNeeds, 10);

 this.setState({
   total: gSum + sSum + hSum + hnSum
 });
 e.preventDefault();
}

render() {
 return (
   <div className="main">
     <Header />
     <hr />
     <div>
       <form onSubmit={this.handleSubmit}>
         <div className="input-flex">
           <InputComponent
             handleChange={this.handleChange}
             name="groceries"
             placeholder="Groceries"
           />
           <InputComponent
             handleChange={this.handleChange}
             name="shopping"
             placeholder="Shopping"
           />
           <InputComponent
             handleChange={this.handleChange}
             name="health"
             placeholder="Health"
           />
           <InputComponent
             handleChange={this.handleChange}
             name="houseNeeds"
             placeholder="Home"
           />
         </div>
         <button>Calculate</button>
       </form>
     </div>

     <AmountCard spent={this.state.total} />

     <BillChart spendings={[this.state.chartData]} />
   </div>
 );
}
}

export default SpendsApp;

这是第二个

 import React from "react";

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

class BillsChart extends React.Component {
constructor(props) {
 super(props);
 this.state = {
   chartData: {
     labels: ["Groceries", "Shopping", "Health", "House Needs"],
     datasets: [
       {
         label: "Amount Spent",
         backgroundColor: "green",
         hoverBackgroundColor: "green",
         hoverBorderWidth: 2,
         hoverBorderColor: "#000",
         data: [this.props.spendings]
       }
     ]
   }
 };
}

render() {
 return <Bar onClick={this.props.handleClick} data={this.state.chartData} />;
}
}

export default BillsChart;

最佳答案

首先,在你的 SpendsApp您从未更改过 chartData 状态值的组件。您更改了总数和其他属性的数量,但您永远不会更改传递的 chartData 的值。

你可以有这样的东西

 //code....
  constructor(props) {
    super(props);

    this.state = {
      groceries: 10,
      shopping: 0,
      health: 0,
      houseNeeds: 0,
      total: 0,
      chartData: []
    }
 }



handleSubmit(e) {
   e.preventDefault();
   const { groceries, shopping, health, houseNeeds } = this.state;

   const gSum = parseInt(groceries, 10);
   const sSum = parseInt(shopping, 10);
   const hSum = parseInt(health, 10);
   const hnSum = parseInt(houseNeeds, 10);

  // chartData array elements should be ordered as in your labels in the <BillsChart/>
  // labels: ["Groceries", "Shopping", "Health", "House Needs"] as you have it
  this.setState({
      total: gSum + sSum + hSum + hnSum,
      chartData: [gSum, sSum, hSum, hnSum] 
  });
}

还有一件事是,而不是这个:

<BillChart spendings={[this.state.chartData]} />

试试这个

<BillChart spendings={this.state.chartData} />

这样做的原因是,如果你正确地传递了数组中的值,你最终会在这里得到一个二维数组 data: [this.props.spendings] .

如果你已经安装了你的组件,你应该使用 componentDidUpdate()改变 <BillChart/> 的状态:

componentDidUpdate(prevProps) {
  if (prevProps.spendings !== this.props.spendings) {
     let chartData = this.state.chartData;

     chartData.datasets[0].data = this.props.spendings
     this.setState({chartData});
  }
}

关于javascript - 如何在 React 中将数据传递给 Chart.js 图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61689665/

相关文章:

javascript - 具有相同大小的两个 div 的 Div(内部 img)

javascript - jquery ajax - 在单击之后但在内容加载之前显示加载div?

angularjs - React 的数据绑定(bind)真的是一种方式吗?好像是有两种方式

javascript - axios 捕获错误然后再次抛出错误

javascript - 提取div所有属性的正则表达式

javascript - 编译 React 失败

javascript - react native中常用的js模块

javascript - Reactjs类型错误: Class extends value undefined is not a constructor or null

javascript - 如何在单击时显示/隐藏具有特定类的元素?

javascript - 有人可以解释为什么我的输入字段值没有改变吗