Вы не за горами в вашей попытке.
Есть две проблемы:
Задача 1.
Чтобы получить тот же эффект, что и componentWillMount
(примечание: это устаревший метод, используйте componentDidMount
или constructor
), вам нужно указать useEffect
запуск только один раз при монтировании. Для этого вы даете ему пустой массив зависимостей.
useEffect(() => {
// do stuff
}, []); // empty array as second argument
Если не указать второй аргумент, эффект будет выполняться при каждом отдельном рендере.
Задача 2.
Обновления состояний асинхронные. Это означает, что вы не можете консоль журнала apiResponse
сразу после обновления и ожидать, что он будет содержать новое значение.
Чтобы обойти это, просто console.log внутри тела функции за пределами ловушки.
Вот упрощенный пример:
const {useState, useEffect} = React;
const Example = () => {
const [apiResponse, setApiResponse] = useState();
useEffect(() => {
const fetchApiResponse = () => {
const result = 'test';
setApiResponse(result);
// Will not be updated
console.log("wrong: apiResponse ", apiResponse);
}
fetchApiResponse();
}, []);
// Will be updated
console.log("right: apiResponse ", apiResponse);
return <span />
}
ReactDOM.render(<Example />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>