我在pages/post/index.js中使用getServerSideProps:
import React from "react";
import Layout from "../../components/Layout";
function Post({ post }) {
console.log("in render", post);
return (
<Layout title={post.name}>
<pre>{JSON.stringify(post, undefined, 2)}</pre>
</Layout>
);
}
export async function getServerSideProps({ query }) {
return fetch(
`${process.env.API_URL}/api/post?id=${query.id}`
)
.then(result => result.json())
.then(post => ({ props: { post } }));
}
export default Post;
当我直接加载/post/2
时,它按预期工作,但当我通过单击链接从/posts
转到/post/2
时:
<Link
as={`/post/${post.id}`}
href={`/post?id=${post.id}`}
>
看起来2秒钟内什么都没有发生(API延迟),然后内容显示。我可以在网络选项卡中看到_next/data/development/post/9.json
正在被fetchNextData加载。
当我使用next/Link
从一条路线移动到另一条路线时,我想显示一个加载微调器,但是我在getServerSideProps上找不到任何允许我这样做的文档。
当我直接转到/post/:id
时,我希望从服务器端获取数据,并得到一个完全呈现的页面(工作),但当我转到另一个路由时,数据应该从客户端获取(工作)。我想有一个加载指示器,而不是有UI冻结了数据请求的持续时间。
7条答案
按热度按时间cig3rfwq1#
这是一个使用钩子的example。
pages/_app.js
bmp9r5qi2#
您可以在
_app.js
中使用nprogress或动态导入到
_app.js
以减少捆绑包大小ProgessBar.js
_app.js
Ps:如果你想改变进度条的颜色,你可以在全局css中覆盖,类似这样的东西
iibxawm43#
可以创建自定义挂接:
usePageLoading.ts
然后在
App
组件中使用它:_app.js
0sgqnhkj4#
简单地向Post添加一个组件级加载状态如何(相对于为每个路由更改添加一个应用级加载器,因为一些路由更改可能不需要服务器端呈现)。
当相关的查询参数改变时,将isLoading状态设置为true,在本例中是post id,而当props(在本例中是post数据)更新时,将状态设置为false。
按照以下方针:
页数/帖子/index.js:
368yc8dk5#
结果:
pkmbmrz76#
除了前面的答案之外,您还可以在事件处理程序中接收一个
url
参数,并使用这些参数来筛选出您想要加载状态的路由和不想要的路由。t9aqgxwy7#
进度条,如NProgress,90行代码(与NProgress v0.2.0相比,为470行. js +70行. css):
使用方法:
更多信息:https://gist.github.com/tkrotoff/db8a8106cc93ae797ea968d78ea28047