【发布时间】:2021-01-03 15:09:09
【问题描述】:
我正在尝试在 React Hooks 中使用 useState 更改 React-Select 值时更改 Chart.js 数据集。
在handleChange函数中的console.log(event),我得到了想要的结果,但是在下面写的switch语句中使用它是个问题。
参考代码在这里 - https://codesandbox.io/s/sparkling-morning-8lghs?file=/src/App.js:925-979
在 React-Select 添加 onChange 后,尝试实现更改图表数据集的逻辑:https://codesandbox.io/s/hopeful-fog-55yv8?file=/src/App.js
如何在 switch 语句的 handleChange 函数中使用我得到的值?
import React, {useState, useEffect} from "react";
import Select from "react-select";
import {Bar} from "react-chartjs-2";
import axios from "axios";
const CanvasFour = () => {
const [chartData, setChartData] = useState({});
const [userSelect, setUserSelect] = useState({});
const [hour, setHour] = useState({});
const [day, setDay] = useState({});
const [data, setData] = useState({});
let event;
const getRandomColors = (numOfBars) => {
const letters = "0123456789ABCDEF".split("");
let colors = [];
for(let i = 0; i < numOfBars; i++){
let color = "#";
for(let k = 0; k < 6; k++){
color += letters[Math.floor(Math.random() * 16)];
}
colors.push(color)
}
return colors
}
const options=[
{label:'last hour', value:'hour'},
{label:'last day', value:'day'},
{label:'last week', value:'week'},
{label:'last month', value:'month'},
{label:'last year', value:'year'}
];
function customTheme(theme){
return{
...theme,
colors:{
...theme.colors,
primary25:'#43425d',
primary:'#3c4a64',
},
};
}
const chart = () => {
let empSal = [];
let empAge = [];
axios.get("http://dummy.restapiexample.com/api/v1/employees")
.then(res => {
// console.log(res)
for(const dataObj of res.data.data){
empSal.push(parseInt(dataObj.employee_salary))
empAge.push(parseInt(dataObj.employee_age))
}
const labels = empAge;
const hour = {
labels,
datasets: [{
label:'Agent performance',
data: empSal,
backgroundColor: getRandomColors(labels.length),
borderWidth: 2
}]
}
const day = {
labels,
datasets: [{
label:'Agent performance',
data: [3454,4555,4554,5454,4542,6543,3445,4567],
backgroundColor: getRandomColors(labels.length),
borderWidth: 2
}]
}
switch (event) {
case 'hour':
setData = hour
break;
case 'day':
setData = day
break;
default:
break;
}
setChartData({
setData
})
})
.catch(err => {
console.log(err);
});
}
useEffect( () => {
chart();
}, []);
const handleChange = (value) => {
event = value.value;
console.log(event);
// switch (event) {
// case 'hour':
// setData = hour
// break;
// case 'day':
// setData = day
// break;
// default:
// break;
// }
}
return (
<div className="card-one">
<span className="dropdown-select">
<Select options={options} defaultValue={options[0]} theme={customTheme} onChange={handleChange}/>
</span>
<Bar
data={chartData}
options={{
responsive:true,
scales:{
yAxes:[{
ticks:{
beginAtZero: true
}
}]
},
legend:{
display: true,
position: "bottom"
}
}}
height={140}
/>
</div>
);
}
export default CanvasFour;
【问题讨论】:
-
这个问题有点不清楚,可以从几个方面改进。 1) 创建一个实际运行的最小的、可重现的示例(即将 MRE 添加为代码 sn-p 以便它可以直接在问题中运行); 2)添加有关哪些内容不起作用以及您尝试过的内容的上下文。话虽如此,我将尝试回答:
useState返回当前值(在您的情况下为data),以及更改该数据的函数(setData)。您直接分配给setData,而不是调用它(例如setData(day))。 -
您好!感谢您的答复。我对问题进行了更改。请问,你会看一下吗?我会很感激的。
-
我已尝试对您的问题进行一些修改,但即使在您更新后仍不清楚。不过不管怎样,等着看人帮你吧。
标签: javascript reactjs react-select