Как вывести информацию в react-компонент из асинхронной функции?

Есть асинхронная функция, которая возвращает promis с данными. Как вывести эти данные внутри компонента? В примере ниже в {data} ничего не выведется, так как функция ещё не успела отработать. Какие существуют способы это исправить?

async function someAsyncFunction() {
  /*...*/
  return 'result'
}

function App() {
  const [data, setData] = useState('')

  setData(someAsyncFunction())

  return (
    <div>
      {data}
    </div>
  )
}

Ответы (1 шт):

Автор решения: EzioMercer

Вам надо воспользоваться ф-ией useEffect:

<div id="react"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.production.min.js"></script>

<script src="https://unpkg.com/@babel/standalone@7/babel.min.js"></script>
<script type="text/babel">
const {useState, useEffect} = React;

async function someAsyncFunction() {
  try {
    const response = await fetch('https://rickandmortyapi.com/api/character/1');
      
    if (response.ok) {
      return await response.json();
    } else {
      console.log("Can't get data");
    }
  } catch (e) {
    console.log(e);
  }
}

function App() {
  const [name, setName] = useState('');
  
  useEffect(() => {
    async function datesInit() {
      const data = await someAsyncFunction();
      setName(data.name);
    }
    
    datesInit();
  }, [])
  
  return (
    <div>
      {name}
    </div>
  );
}

// Рендеринг
ReactDOM.render(
  <App />,
  document.getElementById('react')
);
</script>

→ Ссылка