nextjs getServerSideProps 显示加载

HMR*_*HMR 9 javascript reactjs next.js

我在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;
Run Code Online (Sandbox Code Playgroud)

当我直接加载/post/2它时,它按预期工作,但是当我通过单击链接从/posts到时/post/2

<Link
  as={`/post/${post.id}`}
  href={`/post?id=${post.id}`}
>
Run Code Online (Sandbox Code Playgroud)

看起来 2 秒(api 延迟)没有任何反应,然后显示内容。我可以在fetchNextData_next/data/development/post/9.json加载的网络选项卡中看到

当我从一条路线移动到另一条路线时,我想显示一个加载微调器,next/Link但我在 getServerSideProps 上找不到任何允许我这样做的文档。

当我直接访问时,/post/:id我希望在服务器端获取数据并获得完全呈现的页面(有效),但是当我移动到另一条路线时,应从客户端获取数据(有效)。然而; 我想要一个加载指示器,并且在数据请求期间不要让 UI 冻结。

HMR*_*HMR 28

这是一个使用钩子的例子

页面/_app.js

import Router from "next/router";

export default function App({ Component, pageProps }) {
  const [loading, setLoading] = React.useState(false);
  React.useEffect(() => {
    const start = () => {
      console.log("start");
      setLoading(true);
    };
    const end = () => {
      console.log("findished");
      setLoading(false);
    };
    Router.events.on("routeChangeStart", start);
    Router.events.on("routeChangeComplete", end);
    Router.events.on("routeChangeError", end);
    return () => {
      Router.events.off("routeChangeStart", start);
      Router.events.off("routeChangeComplete", end);
      Router.events.off("routeChangeError", end);
    };
  }, []);
  return (
    <>
      {loading ? (
        <h1>Loading...</h1>
      ) : (
        <Component {...pageProps} />
      )}
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

  • 无论如何,有没有办法让它*仅*为“getServerSideProps”工作?我之所以这么问,是因为它为我的“getServerSideProps”显示了大约 2 秒的“正在加载”(看起来不错),但对于其他路由(例如只是普通的静态路由),它闪烁得非常快,这对用户来说看起来很糟糕。 (3认同)
  • 这不适用于使用 Nextjs 12.1.5 的 getServerSideProps,也许有些东西发生了变化。页面加载时不会显示任何控制台日志。 (2认同)

iam*_*ynq 13

您可以使用nprogress_app.tsx

import NProgress from 'nprogress';
import Router from 'next/router';
import "nprogress/nprogress.css";

NProgress.configure({
  minimum: 0.3,
  easing: 'ease',
  speed: 800,
  showSpinner: false,
});

Router.events.on('routeChangeStart', () => NProgress.start());
Router.events.on('routeChangeComplete', () => NProgress.done());
Router.events.on('routeChangeError', () => NProgress.done());
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我会尝试[这个例子](https://github.com/zeit/next.js/blob/canary/examples/with-loading/pages/_app.js)。 (3认同)
  • 不要忘记导入 css,否则它不会显示。`导入“nprogress/nprogress.css”;` (2认同)