Возвращает результат из API и отображает его с помощью react

#reactjs #return #state #react-props #webapi

#reactjs #Возврат #состояние #react-props #webapi

Вопрос:

У меня есть базовое приложение react, в котором я хотел бы отображать результаты из моего API, который подключен к моей базе данных.

В настоящее время у меня есть метод выборки, который вызывает мой api, в консоли я вижу, что он содержит правильные данные из базы данных, но я не уверен, как отобразить его в react, не могли бы вы помочь? У меня есть следующий код:

 import React, { useEffect, useState } from 'react';

function DisplayCases(props) {

  const [appState, setAppState] = useState({
    loading: false,
    repos: null,
  });

  useEffect(() => {
    setAppState({ loading: true });
  const proxyurl = "https://cors-anywhere.herokuapp.com/";
const url = "<my api url>" ;
fetch(proxyurl   url) 
      .then((res) => res.json())
      .then(contents => console.log(contents))
      .then((repos) => {
        setAppState({ loading: false, repos: repos });
      });
  }, [setAppState]);


  return (
      <div className='container'>
        <h1>Welcomme {props.location.state}, here are your open cases:</h1>
    <p> {appState.repos}</p>
    </div>
  );
}

export default DisplayCases;
  

На данный момент

AppState.repos вообще ничего не отображает, но (contents => console.log(contents)) содержит информацию, которую я хочу отобразить («случаи» включают имя клиента, фамилию клиента и т. Д.) Я хочу, чтобы он отображался как список, если это возможно.

Ответ №1:

Лучше всего создавать другой .then только при выполнении асинхронного действия, иначе вы создаете больше синтаксического шума и потенциальных ошибок, подобных этой. Поскольку console.log ничего не возвращает, этот раздел:

 .then(contents => console.log(contents))
.then((repos) => {
  setAppState({ loading: false, repos: repos });
});
  

передает возвращаемое значение console.log следующему .then , которое есть undefined . Изменить на:

 .then((repos) => {
  console.log(repos);
  setAppState({ loading: false, repos: repos });
});
  

Или, что еще лучше, loading полностью удалите свойство и просто проверьте, repos существует оно или нет, если вам нужно будет сделать это позже.

 const [repos, setRepos] = useState();
// ...
.then(res => res.json())
.then(setRepos)
.catch(handleErrors); // don't forget to handle errors
// ...

<p> {repos}</p>
  

Помните, что состояние функционального компонента обычно следует разделять на отдельные переменные, когда это возможно, если они относятся к отдельным вещам — наличие одной главной переменной состояния вместо этого немного противоречит шаблону.