Цвет точки React Native Calendar отображается неправильно

Я разрабатываю приложение с помощью react native. Я использую библиотеку «react-native-calendars». Но у меня есть ошибка.

Я работал над получением данных из асинхронного хранилища и ставил точку в календаре.

Это сохраненные данные.

номер списка: 2

1 календарь: 30 марта 2023 г.

30.03.2023календарь: счастливо-розовый

2календарь: 31 марта 2023 г.

31.03.2023календарь: счастливо-желтый

И это мой код.

import React, {useState, useEffect} from 'react';
import {SafeAreaProvider} from 'react-native-safe-area-context';
import {Calendar} from "react-native-calendars";
import {View, StyleSheet} from 'react-native';
import AsyncStorage from "@react-native-async-storage/async-storage";

function HomeScreen({navigation}) {
  const [markedDates, setMarkedDates] = React.useState(null);
  const [dates, setDates] = React.useState([]);

  const readCalendarData = async () => {
    try {
      const listnumber = await AsyncStorage.getItem("listnumber");
      const listnumbertoint = parseInt(listnumber, 10);
      for (var i = 1; i <= listnumbertoint; i++) {
        console.info(i);
        const date = await AsyncStorage.getItem(i + "calendar");
        console.info(date);
        const color = await AsyncStorage.getItem(date + "calendar");
        console.info(color);
        if (color == "happy-pink" || color == "happy2-pink") {
          dates.push(date);
          let obj = dates.reduce(
            (c, v) =>
              Object.assign(c, {
                [v]: { marked: true, dotColor: 'pink' },
              }),
            {},
          );
          setMarkedDates(obj);
        }else if (color == "happy-yellow"){
         dates.push(date);
          let obj = dates.reduce(
            (c, v) =>
              Object.assign(c, {
                [v]: { marked: true, dotColor: 'yellow' },
              }),
            {},
          );
          setMarkedDates(obj);
        }else if (color == "sad-skyblue") {
          dates.push(date);
          let obj = dates.reduce(
            (c, v) =>
              Object.assign(c, {
                [v]: { marked: true, dotColor: 'skyblue' },
              }),
            {},
          );
          setMarkedDates(obj);
        }else if (color == "soso-green") {
          dates.push(date);
          let obj = dates.reduce(
            (c, v) =>
              Object.assign(c, {
                [v]: { marked: true, dotColor: 'green' },
              }),
            {},
          );
          setMarkedDates(obj);
        }else if (color == "soso-orange") {
          dates.push(date);
          let obj = dates.reduce(
            (c, v) =>
              Object.assign(c, {
                [v]: { marked: true, dotColor: 'orange' },
              }),
            {},
          );
          setMarkedDates(obj);
        }else{
          dates.push(date);
          let obj = dates.reduce(
            (c, v) =>
              Object.assign(c, {
                [v]: { marked: true, dotColor: 'pink' },
              }),
            {},
          );
          setMarkedDates(obj);
        }
      }
    } catch (error) {
      console.error(error);
    }
  };
  useEffect(() => {
    readCalendarData();
  }, [])
  return(
      <SafeAreaProvider>
         <View>
            <Calendar
              markedDates = {markedDates}
              onDayPress = {(day) => {
                navigation.push('Detail', {day});
              }}
           />
         </View>
      </SafeAreaProvider>
  );
}

export default HomeScreen;

А когда работает, то точки отображаются хорошо на датах 2023-03-30 и 2023-03-31, но цвет желтый.

И я удалил данные и сохранил данные, чтобы показать 2023-03-30 небесно-голубым цветом, и сохранил данные, чтобы показать 2023-03-31 зеленым цветом.

Но опять же на этот раз показывает нормально, но проблема в том, что цвет зеленый.

Вы можете помочь мне? Пожалуйста, помогите мне, если можете.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
134
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть проблема с кодом, из-за которого выбранный цвет для всех отмеченных дат становится "pink", когда цвет "happy-pink" или "happy2-pink". Это связано с тем, что функция setMarkedDates вызывается внутри цикла и перезаписывает весь объект markedDates новым объектом, который имеет только текущую дату с соответствующим цветом.

Чтобы решить эту проблему, вы можете создать временный объект вне цикла и использовать его для накопления отмеченных дат с соответствующими цветами. Затем вы можете установить состояние markedDates один раз вне цикла.

Вот обновленный код:

const readCalendarData = async () => {
  try {
    const listnumber = await AsyncStorage.getItem("listnumber");
    const listnumbertoint = parseInt(listnumber, 10);
    const tempMarkedDates = {}; // create temporary object
    for (var i = 1; i <= listnumbertoint; i++) {
      console.info(i);
      const date = await AsyncStorage.getItem(i + "calendar");
      console.info(date);
      const color = await AsyncStorage.getItem(date + "calendar");
      console.info(color);
      let dotColor;
      switch (color) {
        case "happy-pink":
        case "happy2-pink":
          dotColor = 'pink';
          break;
        case "happy-yellow":
          dotColor = 'yellow';
          break;
        case "sad-skyblue":
          dotColor = 'skyblue';
          break;
        case "soso-green":
          dotColor = 'green';
          break;
        case "soso-orange":
          dotColor = 'orange';
          break;
        default:
          dotColor = 'pink';
      }
      if (!tempMarkedDates[date]) {
        tempMarkedDates[date] = { marked: true, dotColor }; // add new date to temporary object
      } else {
        tempMarkedDates[date].dotColor = dotColor; // update existing date with new color
      }
    }
    setMarkedDates(tempMarkedDates); // set markedDates state once outside of the loop
  } catch (error) {
    console.error(error);
  }
};

Спасибо за публикацию полезного ответа. Также спасибо за сокращение кода.

bum 30.03.2023 11:34

Другие вопросы по теме