Как динамически заполнять даты, отмеченные в календаре, из api — React Native, redux

#javascript #reactjs #react-native #api #redux

#javascript #reactjs #react-native #API #redux

Вопрос:

Как сказано в заголовке, мне нужно заполнить отмеченные даты, которые я получаю из API в компоненте календаря (я использую «react-native-calendars»: «^ 1.403.0»).

 enter code here : <Calendar
    markedDates={{
       "2020-09-15": { selected: true, marked: true, selectedColor: "blue" },
       "2020-09-05": { selected: true, marked: true, selectedColor: "blue" },
       }}/>
  

Это работает нормально, но моя проблема в том, как динамически отмечать дни из API. вот мой код

const calendar возвращается при входе в систему

 Array [
   Object {
    "course_id": 1,
    "created_at": "2020-09-08T12:52:05.000000Z",
    "date": "2020-09-25",
    "description": "Amet quas nemo aliquid cupiditate libero deserunt et excepturi.",
    "group_id": 1,
    "homework": "Illo eveniet est et non molestiae ut ab atque.",
     "id": 571,
    "time_duration": 89,
    "time_start": "14:49:37",
    "title": "Ms.",
    "updated_at": "2020-09-08T12:52:05.000000Z",
   },
  Object {
    "course_id": 1,
     "created_at": "2020-09-08T12:52:09.000000Z",
     "date": "2020-09-30",
    "description": "Earum similique molestiae sunt praesentium et ea iste deserunt.",
    "group_id": 1,
    "homework": "Autem aspernatur beatae in rerum rerum sit harum quis.",
    "id": 831,
     "time_duration": 89,
    "time_start": "21:53:01",
    "title": "Prof.",
    "updated_at": "2020-09-08T12:52:09.000000Z",
   },
 ]
  

вот весь код:

   const CalendarScreen = (props) => {
  const dispatch = useDispatch();
  const access_token = useSelector((state) => state.auth.token);
  const calendar = useSelector((state) => state.calendarClasses.calendar);
  const isCalendarLoading = useSelector(
    (state) => state.calendarClasses.isCalendarLoading
  );

  const obj = Object.fromEntries(calendar.map((item) => ["date", item.date]));

  let day= JSON.stringify(obj.date);

  useEffect(() => {
    dispatch(loadCalendar());
    dispatch(getCalendar(access_token, childId));
  }, [dispatch, getCalendar]);


  return (
      <Calendar
        markedDates={{
          day: { selected: true, marked: true, selectedColor: "blue" },
      
        }}
/>
  

Каждое предложение будет приятным. Спасибо

Ответ №1:

Решение:

  const CalendarScreen = (props) => {
  const dispatch = useDispatch();
  const access_token = useSelector((state) => state.auth.token);
  const calendar = useSelector((state) => state.calendarClasses.calendar);
  const isCalendarLoading = useSelector(
    (state) => state.calendarClasses.isCalendarLoading
  );

  useEffect(() => {
    dispatch(loadCalendar());
    dispatch(getCalendar(access_token, childId));
  }, [dispatch, getCalendar]);

  let markedDay = {};

  calendar.map((item) => {
    markedDay[item.date] = {
      selected: true,
      marked: true,
      selectedColor: "purple",
    };
  });


  return (
      <Calendar markedDates={ markedDay }
        ...
    />
}
  

Обратите внимание, что в компоненте Calendar — markedDates = { } , отмеченные даты должны быть с одним {}, потому что markedDay является объектом. Таким образом, вы не можете установить, как в документации <Calendar markedDatse={{ markedDay }} /> потому что это будет похоже на markedDates= {{{ }}} .

Комментарии:

1. Я хочу установить разные даты с разными цветами. Что-то не так с этим: ` markedDates={{ [fechaInicioContrato]: {selected: true, выбранный цвет: «зеленый» }, [fechaFinContrato]: {selected: true, выбранный цвет: «красный» }, }} `

Ответ №2:

Вам не хватает только нескольких квадратных скобок вокруг даты:

 markedDates={{
  [day]: { selected: true, marked: true, selectedColor: "blue" },
}}