Вы можете получить этот результат, но вам нужно будет сделать это по-другому.
Когда ваш компонент рендерится в первый раз, запустится вся функция, а затем страница будет обновлена на основе на что вернулась твоя функция. Это происходит более или менее синхронно. Ваши эффекты запускаются только после того, как он отрендерен. Изменить порядок этого невозможно: рендеринг всегда первый, эффекты всегда после рендеринга.
Так что, если вы не хотите, чтобы что-либо отображалось, пока этот эффект не завершится, вам нужно вернуть ноль от рендера. Затем, когда выборка завершена, вы обновляете состояние, в результате чего он снова отображается, на этот раз не с нулевым значением.
Например, здесь я взял ваш код и добавил еще одну возможность: состояние может быть нулевым. Я использую это, чтобы указать, что это еще не загружено. Позже, когда данные извлечены, состояние обновляется и компонент перерисовывается.
const [posts, setPosts] = useState(null);
useEffect(() => {
(async () => {
const data = await fetch('https://localhost:1111/api/posts', {
credentials: 'include'
});
const response = await data.json();
setPosts(response);
})();
}, []);
if (posts === null) {
return null;
}
return (
<div>
{posts.length > 0 ? (
posts.map(post => (
<Post key={post.id} onUpdate={() => handleUpdate()} post={post} />
))
) : (
<p>No posts</p>
)}
</div>
);