Собственный экран React не будет повторно отображаться после извлечения данных и настройки состояния с помощью HTTP-запроса

#javascript #reactjs #react-native #http #axios

Вопрос:

Я использую собственный API Google react для запроса данных календаря через HTTP — запрос с помощью axios.

После того, как пользователь нажимает кнопку входа в систему, функция calendarData запускается и успешно извлекает данные, которые я использую setCalendarEvents для настройки состояния моей страницы на эти данные ответа.

Я ожидал, что это приведет к повторному отображению экрана и отображению данных, но это не так…Как я могу инициировать обновление страницы после получения этих данных из HTTP-запроса без повторного отображения вручную?

государство

 const [calendarEvents, setCalendarEvents] = useState([]);  

Функция calendarData ЗАПУСКАЕТСЯ ПОСЛЕ НАЖАТИЯ ПОЛЬЗОВАТЕЛЕМ КНОПКИ ВХОДА В СИСТЕМУ

 const calendarData = async function signInWithGoogleAsync() {  try {  const result = await Google.logInAsync({  androidClientId: `['CLIENT ID]`,  iosClientId: `['CLIENT ID']`,  scopes: [  "profile",  "email",  "https://www.googleapis.com/auth/calendar",  "https://www.googleapis.com/auth/calendar.events",  ],  });   if (result.type === "success") {   axios({ //HTTP GET REQUEST FOR DATA  method: "get",  baseURL: "https://www.googleapis.com/calendar/v3/calendars/['USER CALENDAR]/events?key=['API KEY']",   headers: {  Authorization: "Bearer "   result.accessToken,  Accept: "application/json",  },  })  .then((response) =gt; {  const responseDataArray = []; //RESPONSE DATA  response.data["items"].map((event) =gt; {  if (typeof event["start"].dateTime !== undefined) {  responseDataArray.push(event);  } //SET STATE TO RETREIVED AND FILTERED DATA STORED IN responseDataArray  setCalendarEvents(responseDataArray);  });  }) //CATCH ERRORS  .catch((error) =gt; console.log(error));  } else {  return { cancelled: true };  }  } catch (e) {  return { error: true };  }  };   

ГДЕ ДАННЫЕ ДОЛЖНЫ ОТОБРАЖАТЬСЯ НА ЭКРАНЕ ПОСЛЕ УСПЕШНОГО ПОЛУЧЕНИЯ

 return (  lt;Viewgt;  {calendarEvents.map((event) =gt; {  lt;Viewgt;{event}lt;/Viewgt;  }  } lt;/Viewgt;  )  

ПРИМЕР ЭЛЕМЕНТА ДАННЫХ ОТВЕТА

Я ищу, чтобы отфильтровать "start":{"dateTime":"2021-04-16T17:30:00-04:00"} , если он существует

 {"kind":"calendar#event","etag":""3237003518996000"","id":"7t1q67ai1p7t586peevd7s9mhg","status":"confirmed","htmlLink":"https://www.google.com/calendar/event?eid=N3QxcTY3YWkxcDd0NTg2cGVldmQ3czltaGcgbWF0dEBoZWFydGhkaXNwbGF5LmNvbQ","created":"2021-04-14T16:45:34.000Z","updated":"2021-04-15T15:49:19.498Z","summary":"customer journey beta buddies","creator":{"email":"meilin@hearthdisplay.com"},"organizer":{"email":"meilin@hearthdisplay.com"},"start":{"dateTime":"2021-04-16T17:30:00-04:00"},"end":{"dateTime":"2021-04-16T18:30:00-04:00"},"iCalUID":"7t1q67ai1p7t586peevd7s9mhg@google.com","sequence":0,"attendees":[{"email":"meilin@hearthdisplay.com","organizer":true,"responseStatus":"accepted"},{"email":"matt@hearthdisplay.com","self":true,"optional":true,"responseStatus":"accepted"},{"email":"susie@hearthdisplay.com","responseStatus":"accepted"},{"email":"nathalie@hearthdisplay.com","responseStatus":"accepted"}],"hangoutLink":"https://meet.google.com/xyb-qhpb-uej","conferenceData":{"entryPoints":[{"entryPointType":"video","uri":"https://meet.google.com/xyb-qhpb-uej","label":"meet.google.com/xyb-qhpb-uej"},{"entryPointType":"more","uri":"https://tel.meet/xyb-qhpb-uej?pin=3822838393771","pin":"3822838393771"},{"regionCode":"US","entryPointType":"phone","uri":"tel: 1-818-514-5197","label":" 1 818-514-5197","pin":"222000933"}],"conferenceSolution":{"key":{"type":"hangoutsMeet"},"name":"Google Meet","iconUri":"https://fonts.gstatic.com/s/i/productlogos/meet_2020q4/v6/web-512dp/logo_meet_2020q4_color_2x_web_512dp.png"},"conferenceId":"xyb-qhpb-uej","signature":"AGirE/Jmi4pFHkq0kcqgRyOuAR2r"},"reminders":{"useDefault":true},"eventType":"default"}  

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

1. Вы уже доказали себе, что responseDataArray-это определенно список, содержащий материалы?

2. О, и не называйте setCalendarEvents на карте. Поскольку это асинхронная функция, которая просто не имеет смысла. Вместо этого вычислите, каким вы хотите видеть новое состояние, а затем установите его один раз.

3. Под фильтром вы подразумеваете свою if (typeof time !== undefined) линию? Это ничего не делает, потому что оператор typeof всегда возвращает строку. Если вы покажете пример того, что такое reponse.data.items, я легко смогу показать код, который составит нужный вам список.

4. О, и ваш calendarEvents.map на самом деле ничего не возвращает. Это действительно распространенная ошибка в JS, потому что без фигурных скобок есть неявное возвращение. Это легко уловить, сначала войдя calendarEvents в систему и убедившись, что это список с содержимым, а затем проверив DOM, чтобы увидеть, есть ли тег lt;Viewgt; для каждого из них. Затем вы можете легко выполнить отладку оттуда.

5. И просто для удовольствия: чтобы избавиться от мутации, вы можете написать setCalendarEvents((response.data?.items || []).filter(e =gt; e?.start?.dateTime ?? false)); вместо этого.

Ответ №1:

Может быть, попробуем с помощью этого добавить условный рендеринг :

 return ({  calendarEvents.lengthgt;0 amp;amp;  calendarEvents?.map(...your code)  })  

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

1. я попробовал это, и я все еще получаю те же результаты, что и раньше. Я бы подумал, что это решение сработает, поэтому мне интересно, где я допустил ошибку….