- 我想在第一次渲染之前执行"useLayoutEffect"中的"fetchPostData"和"setPost"。**
function PostViewPage() {
const { postId } = useParams();
const [post, setPost] = useState({});
const fetchPostData = async () => {
const postRawData = await callPostUrl(postId);
return postRawData.data;
};
useLayoutEffect(() => {
fetchPostData().then((res) => {
setPost(res);
});
}, []);
return (
<Wrapper>
<PageHeader
pageTitle="게시글"
rightButton={<img src={Menu} alt="img" />}
/>
<ViewCard key={postId} type={"full"} post={post} postId={postId} />
</Wrapper>
);
}
我读到过useLayoutEffect是在布局之前执行的,这与useEffect不同,但名为"post"的状态(由"setPost"更改)在第二次渲染时仍然会更改。
这个问题是因为我想把"post"作为 prop 给名为"ViewCard"的组件。ViewCard使用"~. map "函数使用" post "。因为在第一次渲染时没有给" post "任何东西," ViewCard "返回错误。
无法读取未定义的属性(正在读取"map")
,这意味着"post"中没有数据。
由于第一次渲染中的错误,未执行第二次渲染。
我觉得post应该在组件返回的时候修改,我的意思是,post不是应该在第一次渲染的时候修改吗?
当我读到这篇文章时,我认为"setPost"正在进行重新渲染。https://jsramblings.com/are-you-logging-the-state-immediately-after-updating-it-heres-why-that-doesnt-work/
那么我如何在第一次渲染时给组件状态呢?请帮助我.
谢谢你。
2条答案
按热度按时间xv8emn3q1#
一种解决方案是检查:
在第一次渲染之前可以调用的仅有的两个方法是
constructor()
和getDerivedStateFromProps()
在此处了解有关Reacting组件生命周期详细信息
cgh8pdjw2#
因此,即使“useLayoutEffect在布局之前执行,不像useEffect",您也是在执行API请求。这需要时间。当您的请求挂起时,代码中没有任何内容可以阻止视图的呈现。
您可以在这里做的是在post状态中没有任何内容时停止呈现视图。