1 回答
TA贡献1963条经验 获得超6个赞
根据您的评论,您希望在初始页面加载时在服务器上进行提取。但是,如果在页面之间导航,您不想在等待getInitialProps返回时阻止渲染。
一种解决方案是检查您是否在服务器上,然后在getInitialProps. 如果在客户端上,请不要进行获取getInitialProps,而是useEffect在您的渲染方法中使用获取。
import {useEffect} from 'react'
import axios from 'axios'
const isServer = () => typeof window === 'undefined'
const getPosts = () => {
return axios.get('https://jsonplaceholder.typicode.com/posts')
.then(response => response.data)
}
function Posts({posts}) {
const [renderPosts, setRenderPosts] = useState(posts)
useEffect(() => {
if(posts === null) {
getPosts()
.then(setRenderPosts)
}
}, [])
return (
<div>
<div>Posts:</div>
<div>
{JSON.stringify(renderPosts)}
</div>
</div>
)
}
Posts.getInitialProps = async (context) => {
if(isServer()) {
return {
posts: await getPosts(),
}
}
else {
return {
posts: null,
}
}
}
export default Posts
顺便说一句,您可能很想在getServerSideProps这里使用它,因为它仅在服务器上渲染时才被调用。但是,当getServerSideProps呈现使用的页面时,它实际上会调用服务器以从 获取数据getServerSideProps,即使您正在使用 导航next/link。来自Next.js 9.3 博客文章:
当使用 next/link 在页面之间导航而不是在浏览器中执行 getServerSideProps 时,Next.js 将对服务器进行获取,这将返回调用 getServerSideProps 的结果。
这仍然会导致您想要避免的阻塞问题。
最后一点,这可能不是一个惯用的解决方案。可能有一个更“标准”的解决方案。我只是找不到一个。您可能还可以在页面组件周围使用包装器,它可以以更一致的方式完成所有这些工作。如果你经常使用这种模式,我会推荐它。
添加回答
举报