Мне кажется, что ни один из ответов на самом деле не отвечает на вопрос.
useEffect
не останавливает поток выполнения, не имеет значения, что вы делаете внутри переданного ему обратного вызова. Таким образом, выполняется console.log(data.rates)
, а затем, когда компонент монтируется, выполняется обратный вызов, переданный в useEffect
. Поскольку состояние изменяется в обратном вызове (setData(result.data)
), это вызывает повторный рендеринг, и на этот раз вы должны увидеть, что правильное значение регистрируется без каких-либо ошибок.