Сохраненный объект JSON в нашем контексте API-состояния невольно изменяется при вызове отдельного обработчика событий, предназначенного только для изменения фильтра на объекте JSON.Это только изменяет определенный набор данных в массиве объекта состояния.
Реагируют на сохраненные данные контекста следующим образом:
hpData: {
day: { percentChange: '', data: [60], labels: [60] },
week: { percentChange: '', data: [54], labels: [54] },
month: { percentChange: '', data: [54], labels: [57] },
year: { percentChange: '', data: [40], labels: [40] }
}
Мы используем функцию setTimeRange, которая выбирает данные для их фильтрацииопределенный временной интервал.
setTimeRange = (event, value) => {
this.setState({ timeRange: value });
};
Базовая схема кода, который мы используем, выглядит следующим образом:
import { withStyles } from '@material-ui/core/styles';
import { PortfolioContext } from '../Context/PortfolioContext';
import LineChartComponent from '../Charts/LineChartComponent';
import MakeTabs from './MakeTabs';
class Portfolio extends Component {
state = {
timeRange: 2, // 0 = day, 1 = week, 2 = month, 3 = year
setTimeRange: this.setTimeRange
};
toTimeString = value => {
let timeString = '';
switch (value) {
case 0:
timeString = 'day';
break;
case 1:
timeString = 'week';
break;
case 2:
timeString = 'month';
break;
case 3:
timeString = 'year';
break;
default:
timeString = 'month';
}
return timeString;
};
setTimeRange = (event, value) => {
this.setState({ timeRange: value });
};
render() {
const { classes } = this.props;
const { timeRange } = this.state;
const timeString =
this.toTimeString(timeRange)
.charAt(0)
.toUpperCase() + this.toTimeString(timeRange).substr(1);
return (
<PortfolioContext.Consumer>
{context => {
const { hpData } = context.state;
const lineData = hpData[timeString.toLowerCase()].data
? hpData[timeString.toLowerCase()].data
: null;
const lineLabels = hpData[timeString.toLowerCase()].labels
? hpData[timeString.toLowerCase()].labels
: [];
const percentChange = hpData[timeString.toLowerCase()].percentChange
? hpData[timeString.toLowerCase()].percentChange
: '';
return (
<React.Fragment>
<div>
<Grid container className={classes.root} direction='column' spacing={1}>
<Grid item style={{ marginBottom: 8, height: 68, width: '100%' }}>
<MakeTabs
darkMode={darkMode}
classes={classes}
value={timeRange}
setTimeRange={this.setTimeRange}
/>
</Grid>
<Grid item xs={12} md={6}>
<LineChartComponent
darkMode={darkMode}
labels={lineLabels}
data1={lineData}
yAxisSymbol={'$'}
title={
timeString === 'Day'
? 'Portfolio Value: Today'
: `Portfolio Value: ${timeString}`
}
pointSize={0}
padding={[this.props.theme.spacing(2), this.props.theme.spacing(1)]}
showTitle={true}
xAxesTicks={true}
aspectRatio={false}
legendDisplay={false}
/>
</Grid>
</Grid>
</div>
</React.Fragment>
);
}}
</PortfolioContext.Consumer>
);
}
}
export default withStyles(styles, { withTheme: true })(Portfolio);
В частности, у нас есть JSON метки диаграммы / набора данных, который находится в форме.
hpData: {
day: { percentChange: '', data: [60], labels: [60] },
week: { percentChange: '', data: [54], labels: [54] },
month: { percentChange: '', data: [57], labels: [57] },
year: { percentChange: '', data: [40], labels: [40] }
}
У нас есть обработчик событий, который выбирает между различными периодами времени в вышеуказанном объекте и отображает их на графике.Проблема заключается в том, что при выборе между, например, месяцем недели, массив data
недели сохраняется в массиве data
месяца.И приводит к следующему:
hpData: {
day: { percentChange: '', data: [60], labels: [60] },
week: { percentChange: '', data: [54], labels: [54] },
month: { percentChange: '', data: [54], labels: [57] },
year: { percentChange: '', data: [40], labels: [40] }
}
Массив данных месяца был установлен на data[54]
с data[57]
.Это происходит только при переключении с месяца на другой временной интервал.Наше состояние по умолчанию для первого рендера - месяц.