【发布时间】:2021-12-31 15:43:09
【问题描述】:
我在反应应用程序中创建了一个条形图。此图表是动态的,通过选中每个复选框,需要上传一组数据。
问题:数据正在更新并显示在图表上,但是当我单击该特定复选框时,没有任何反应,并且图表没有恢复到原始状态。我尝试切换复选框的状态,但问题仍然存在并且图表没有更新。
这是我的代码:
import React, { useEffect, useState } from "react";
import { Bar } from "react-chartjs-2";
const RandomStatic = (props) => {
let jsonData = [
{ gender: "female" },
{ gender: "male" },
{ gender: "female" },
{ gender: "male" },
{ gender: "female" },
{ gender: "male" },
{ gender: "female" },
{ gender: "female" },
{ gender: "female" },
{ gender: "female" },
];
const [userFemaleCounter, setUserFemaleCounter] = useState();
const [userMaleCounter, setUserMaleCounter] = useState();
const [totalCounter, setTotalCounter] = useState();
const [femalePercentage, setFemalePercentage] = useState();
const [malePercentage, setMalePercentage] = useState();
const [chartData, setChartData] = useState(jsonData);
const [femaleIsChecked, setFemaleIsChecked] = useState(false);
const [maleIsChecked, setMaleIsChecked] = useState(false);
useEffect(() => {
// Getting all Data in an array
let allData = jsonData.map(function (e) {
return e.gender;
});
console.log(allData);
// Display Gender data on the chart
let fCounter = [];
let mCounter = [];
allData.forEach((gender) => {
if (gender === "female") {
fCounter = ++fCounter;
} else if (gender === "male") {
mCounter = ++mCounter;
}
});
let userFemaleCounter = fCounter;
setUserFemaleCounter(fCounter);
console.log(userFemaleCounter);
let userMaleCounter = mCounter;
setUserMaleCounter(mCounter);
console.log(userMaleCounter);
let totalCounter = fCounter + mCounter;
setTotalCounter(totalCounter);
console.log(totalCounter);
let femalePercentage = (fCounter / totalCounter) * 100;
setFemalePercentage(femalePercentage);
let malePercentage = (mCounter / totalCounter) * 100;
setMalePercentage(malePercentage);
}, [chartData]);
useEffect(() => {
///change the jsonData
//setChartData
let allData = chartData.map(function (e) {
return e.gender;
});
let mCounter = [];
let fCounter = [];
allData.forEach((gender) => {
if (gender === "female") {
fCounter = ++fCounter;
} else if (gender === "male") {
mCounter = ++mCounter;
}
});
let totalCounter = fCounter + mCounter;
setTotalCounter(totalCounter);
let userFemaleCounter = fCounter;
setUserFemaleCounter(userFemaleCounter);
let femalePercentage = (fCounter / totalCounter) * 100;
setFemalePercentage(femalePercentage);
let userMaleCounter = 0;
setUserMaleCounter(userMaleCounter);
let malePercentage = 0;
setMalePercentage(malePercentage);
}, [femaleIsChecked]);
//useeffect for MALE checkbox
useEffect(() => {
let allData = jsonData.map(function (e) {
return e.gender;
});
let mCounter = [];
let fCounter = [];
allData.forEach((gender) => {
if (gender === "female") {
fCounter = ++fCounter;
} else if (gender === "male") {
mCounter = ++mCounter;
}
});
let totalCounter = fCounter + mCounter;
setTotalCounter(totalCounter);
let malePercentage = (mCounter / totalCounter) * 100;
setMalePercentage(malePercentage);
fCounter = [];
let femalePercentage = [];
setFemalePercentage(femalePercentage);
}, [maleIsChecked]);
const toggleFemale = () => {
if(femaleIsChecked == true)
{
setFemaleIsChecked(false)
}else{
setFemaleIsChecked(true)
}
}
const toggleMale = () => setMaleIsChecked(chartData)
const toggleAll = () => setChartData(!chartData)
//console.log(toggleFemale)
return (
<div>
<Bar
className="chart"
data={{
labels: ["Female", "Male"],
datasets: [
{
data: [femalePercentage, malePercentage],
backgroundColor: ["green", "yellow"],
borderColor: ["green", "yellow"],
borderWidth: 0.5,
},
],
}}
options={{
responsive: true,
maintainAspectRatio: false,
plugins: {
title: {
display: true,
text: "Male and Female Ratio",
},
legend: {
display: false,
},
},
scales: {
y: {
display: true,
title: {
display: true,
text: "Percentage",
},
},
x: {
display: true,
title: {
display: true,
text: "Population",
},
},
},
showTooltips: false,
hover: false,
}}
/>
<div className="checkbox-form-wrapper">
<div className="chartBox">
<label>Female Only</label>
<input
name="femalePercentage"
type="checkbox"
//checked={femaleIsChecked}
onChange={toggleFemale}
/>
<label>Male Only</label>
<input
name="malePercentage"
type="checkbox"
checked={maleIsChecked}
onChange={toggleMale}
/>
<label>Both Female and Male</label>
<input
name="chartData"
type="checkbox"
checked={chartData}
onChange={toggleAll}
/>
</div>
</div>
</div>
);
};
export default RandomStatic;
谢谢你:)
【问题讨论】:
标签: javascript reactjs api react-hooks fetch-api