Разбивка API на страницы в React

#reactjs #use-effect

#reactjs #использование-эффект

Вопрос:

Я создаю компонент диаграмм, который получает данные из API в соответствии с датами, выбранными средством выбора даты.

Обрабатываются даты обработки и вызывающий API. Проблема в том, что когда данные большие (> 50 результатов), следующие данные поступают внутрь объекта в next свойстве. Я должен справиться с этим с этого next момента .

Вот как выглядят возвращаемые данные:

     average_satisfaction: 4.8307692307692305
    next: "nextURL"
    page_size: 50
    previous: null
    results: (50) [{…}, {…}]
    total_count: 130
 

Я думаю о функции, которая обрабатывает API, и я просто вызываю ее, useEffect но я не уверен, как заставить ее проверить это next , а затем получить новые данные и отправить их

  const [results, setResults] = useState([]);

  useEffect(() => {
    if (startDate.length != 0) {
      handleAPIRequest(`someURL`).then((response) => console.log(response.data));
    }
  }, [startDate, endDate]);

  function handleAPIRequest(url) {
    return axios
      .get(url)
      .then((response) => {
        setResults(response.data.results);
        // here is where response.data.next has url of next 50 results
        return response;
      });
  }
 

Ответ №1:

сохраните все результаты в состоянии, а не только данные.результаты.

   function handleAPIRequest(url) {
    return axios
      .get(url)
      .then((response) => {
        setResults(response.data);
        // here is where response.data.next has url of next 50 results
        return response;
      });
  }
 

в вашем рендере у вас может быть кнопка, подобная следующей

 return ( <button onClick={() => handleAPIRequest(response.data.next)}>Get Next</button> )
 

Когда вы нажмете кнопку, она вызовет вашу функцию handleAPIRequest со следующим URL-адресом.

Вы можете сделать то же самое с предыдущей кнопкой.

Обновление — цикл для получения всех результатов.

должно работать что-то вроде следующего.

   function handleAPIRequest(url) {
    return axios
      .get(url)
      .then( async (response) => {

        let finalResults = response.data.results;
        if (response.data.next) {
           let moreResults = await handleAPIRequest(response.data.next);
           finalResults.concat(moreResults)
        }

        // here is where response.data.next has url of next 50 results
        return finalResults;
      });
  }
 

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

1. Сначала мне нужно получить все результаты, чтобы произвести вычисления.