Не уверен, как правильно установить этот фильтр месяцев

#javascript #reactjs #react-native

#javascript #reactjs #react-native

Вопрос:

Snack Я создал гистограмму в react native, которая позволяет пользователям выбирать месяцы, и диаграмма отображается в соответствии с их выбором. введите описание изображения здесьОднако то, что я сделал до сих пор, — это только изменение меток месяцев на оси x. У меня возникли проблемы с реализацией выбора пользователя на самой гистограмме. Смотрите ниже — введите описание изображения здесьСпособ определения переменных datasets соответствует тому, как это было в официальной документации. Цвета должны быть определены для каждой линейки. Я думаю, что если каким-то образом туда можно включить цикл for, в зависимости от количества меток, возможно, сработает фильтр месяцев. Я использую applyDateFilter() для настройки меток на диаграмме.

 import {Chart,LineChart,BarChart,PieChart,ProgressChart,ContributionGraph} from 'react-native-chart-kit'
import React, { Component } from 'react';
import {useState, useEffect, useCallback} from 'react';
import { View, Text, StyleSheet, ImageBackground, Icon, FlatList, Button, TextInput, Dimensions, SafeAreaView, Picker, Alert } from 'react-native';

const initialData = [12, 19, 12, 25, 22, 10];
const initialFrom = "0"
const initialToMonth = "7"
const months = [
      { month: "Jan", value: "0" },
      { month: "Feb", value: "1" },
      { month: "Mar", value: "2" },
      { month: "April", value: "3" },
      { month: "May", value: "4" },
      { month: "June", value: "5" },
    ];
const initialLevelsArr = [
          "Jan",
          "Feb",
          "Mar",
          "April",
          "May",
          "June",
        ];
const initialLabels = ["Jan", "Feb", "Mar", "April", "May", "June"];

export default function FocusScreen() {

const [datas, setDatas] = useState(initialData);
const [from, setFrom] = useState(initialFrom);
const [toMonth, setToMonth] = useState(initialToMonth);
const [labels, setLabels] = useState(initialLabels);

const applyDateFilter = () => {
    const newLabels = initialLevelsArr.slice(
      parseInt(from),
      parseInt(toMonth)   1
    );
    setLabels(newLabels);
    console.log(labels)
  }

const dataset = {
    labels: labels,
    datasets: [
      {
        data: datas,
        colors: [
          (opacity = 1) => `red`,
          (opacity = 1) => `blue`,
          (opacity = 1) => `yellow`,
          (opacity = 1) => `green`,
          (opacity = 1) => `purple`,
          (opacity = 1) => `orange`
        ]
      }
    ]
  }

return (
      <SafeAreaView style={styles.chartContainer}>
      <BarChart
              data={dataset}
              width={300}
              height={220}
              withCustomBarColorFromData={true}
              flatColor={true}
              chartConfig={{
                backgroundColor: '#ffffff',
                backgroundGradientFrom: '#ffffff',
                backgroundGradientTo: '#ffffff',
                data: dataset.datasets,
                color: (opacity = 1) => '#fff',
                labelColor: () => '#6a6a6a',
              }}
            />
      <View style={styles.wrapper}>
            <View>
            <Button
              onPress={() => applyDateFilter()}
              title = "Apply DateFilter"
              color="#841584"
                />
                <View style={{flexDirection:"row"}}>
                    <View style={{flex:1}}>
                        <Picker
                          selectedValue={from}
                          style={{ height: 50, width: 150, justifyContent: 'flex-start' }}
                          onValueChange={(itemValue, itemIndex) => setFrom(itemValue)}
                        >
                          <Picker.Item label ="Jan" value="0" />
                          <Picker.Item label="Feb" value="1" />
                          <Picker.Item label ="Mar" value="2" />
                          <Picker.Item label="Apr" value="3" />
                          <Picker.Item label ="May" value="4" />
                          <Picker.Item label="Jun" value="5" />
                        </Picker>
                    </View>
                    <View style={{flex:1}}>
                    <Picker
                      selectedValue={toMonth}
                      style={{ height: 50, width: 150, justifyContent: 'flex-start' }}
                      onValueChange={(itemValue, itemIndex) => setToMonth(itemValue)}
                    >
                      <Picker.Item label ="Jan" value="0" />
                      <Picker.Item label="Feb" value="1" />
                      <Picker.Item label ="Mar" value="2" />
                      <Picker.Item label="Apr" value="3" />
                      <Picker.Item label ="May" value="4" />
                      <Picker.Item label="Jun" value="5" />
                    </Picker>
                    </View>
                </View>
            </View>

        </View>
    </SafeAreaView>
);
} 
 

Ответ №1:

Попробуйте это:

 const applyDateFilter = () => {
    const newLabels = initialLevelsArr.slice(
      parseInt(from),
      parseInt(toMonth)   1
    );
    const newDatas = initialData.slice(
      parseInt(from),
      parseInt(toMonth)   1
    );

    setLabels(newLabels);
    setDatas(newDatas);
  }
 

Таким образом, фильтр будет применяться и к данным, а не только к меткам.