Как получить только первые данные из API в React?

#arrays #reactjs #json #react-hooks #axios

#массивы #реагирует на #json #реагируют-крючки #аксиос

Вопрос:

В настоящее время я работаю над веб-сайтом, который, когда я его открываю, всегда должен печатать случайную цитату из API. Однако, когда я открываю API, он не случайным образом отображает цитату в формате json, а выводит все цитаты, хранящиеся в массиве. Моя проблема в том, что на моем сайте все кавычки крутятся до тех пор, пока отладчик не остановится из-за нехватки памяти. Как я могу заставить функцию карты отображать только первые данные массива? Мой код:

 const randomIndex = (arr) =gt; {  // returns a random int value to use as an index  return Math.floor(Math.random() * arr.length);  };   const [quote, setQuote] = useState("");  const [index, setIndex] = useState(0);   const QuoteAPI = async () =gt; {  let arrayOfQuotes = [];  const data = await axios.get("https://type.fit/api/quotes");  arrayOfQuotes = data.data;  console.log(arrayOfQuotes);  const quote = arrayOfQuotes.map((arrayOfQuote) =gt; (  lt;div key={arrayOfQuote.id}gt;  lt;h3gt;{arrayOfQuote.text}lt;/h3gt;  lt;pgt;{arrayOfQuote.author}lt;/pgt;  lt;/divgt;  ));  console.log(quote);  setQuote(quote);  };   useEffect(() =gt; {  QuoteAPI();  setIndex(randomIndex(quote));  }, [quote]);  

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

1. Несколько неуверен в том, какова ваша цель здесь. Основываясь на ссылочном URL-адресе, кажется, что существует только твердое состояние из более чем 1600 цитат. Если вы пытаетесь использовать только 1 случайную цитату, вы делаете это неправильно. При загрузке вы должны извлечь данные, а затем случайным образом выбрать цитату на основе длины массива, и я бы кэшировал все цитаты и построил второй массив только из цитат, которые вы использовали, чтобы ваш случайный не повторялся.

2. Будет ли адаптер axios-кэша хорошим выбором для кэширования?

3. Я не играл с ним, не знал бы, не исследуя. В идеале я бы использовал localstorage для хранения цитат и ссылок соответственно. Также зависит от того, есть ли области, которые вы собираетесь использовать, которые могут быть рассмотрены в контексте создания для этого.

4. Я использую localstorage. Я стараюсь, спасибо за вашу помощь!

Ответ №1:

Вам не нужно использовать метод map (), так как он возвращает массив, а не один объект. Все, что вам нужно, это получить первый элемент в возвращаемом массиве, затем отформатировать и отобразить его. Что — то вроде этого:

 let arrayOfQuotes = [];   const data = await axios.get("https://type.fit/api/quotes");   arrayOfQuotes = data.data;   if(arrayOfQuotes.length gt; 0){  const quote = (  lt;div key={arrayOfQuotes[0].id}gt;  lt;h3gt;{arrayOfQuotes[0].text}lt;/h3gt;  lt;pgt;{arrayOfQuotes[0].author}lt;/pgt;  lt;/divgt;);  setQuote(quote);  }  

Кстати, конечная точка API, которую вы используете, возвращает список, в то время как вам нужна одна цитата. Я думаю, что должна быть другая конечная точка, которая предоставляет единственную цитату. Вам нужно проверить документы API, если они у него есть.

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

1. Я попробовал, и он ничего не показывает. Я помещаю console.log(цитата) перед setQuote в коде, и это продолжает вращаться: {$$typeof: Symbol(react.element), type: 'div', key: null, ref: null, props: {…}, …}

2. Почему у вас есть [цитата] в вашем useEffect()? Я думаю, что замена этого на [] решит проблему с вращением. Потому что вам нужно только одно предложение для каждой загрузки страницы. верно? поэтому он не должен получать новую цитату каждый раз при изменении состояния.

3. В нем говорится, что в настоящее время параметризованные запросы не поддерживаются. Конечная точка работает без изменений.

4. Теперь он возвращает только один объект, но по-прежнему не отображает его. Вот что говорит отладчик, когда я удаляю цитату: у React Hook useEffect отсутствует зависимость: «цитата». Либо включите его, либо удалите массив зависимостей.

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