首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nextjs getServerSideProps显示加载

nextjs getServerSideProps显示加载
EN

Stack Overflow用户
提问于 2020-03-19 18:32:26
回答 2查看 14.1K关注 0票数 16

我在pages/post/index.js中使用getServerSideProps

代码语言:javascript
复制
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时:

代码语言:javascript
复制
<Link
  as={`/post/${post.id}`}
  href={`/post?id=${post.id}`}
>

看起来在2秒内没有任何反应(the api delay),然后内容就会显示出来。我可以在网络选项卡中看到fetchNextData正在加载_next/data/development/post/9.json

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

当我直接转到/post/:id时,我希望从服务器端获取数据并获得一个完全呈现的页面(works),但是当我转到另一个路径时,数据应该从客户端获取(works)。但是,我希望有一个加载指示器,并且在数据请求期间UI不会冻结。

EN

回答 2

Stack Overflow用户

发布于 2020-03-19 19:18:04

这是一个使用钩子的example

pages/_app.js

代码语言:javascript
复制
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} />
      )}
    </>
  );
}
票数 34
EN

Stack Overflow用户

发布于 2021-10-30 21:52:58

代码语言:javascript
复制
**Here is how I did it in NextJs with Material UI and nprogress**

import '../styles/globals.css';
import { useEffect, useState } from 'react';
import Router from 'next/router';
import NProgress from 'nprogress';

import { useStyles } from '../src/utils';
import { CircularProgress } from '@material-ui/core';

NProgress.configure({ showSpinner: false });

function MyApp({
  Component,
  pageProps
 
}) {
  const classes = useStyles();
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    const jssStyles = document.querySelector('#jss-server-side');
    if (jssStyles) jssStyles.parentElement.removeChild(jssStyles);

    const start = () => {
      console.log('start');
      NProgress.start();
      setLoading(true);
    };
    const end = () => {
      console.log('findished');
      NProgress.done();
      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 ? (
          <div className={classes.centered}>
            <CircularProgress size={25} color='primary' />
          </div>
        ) : (
        <Component {...pageProps} />
       )}
    </>
  );
}

export default MyApp;

结果:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60755316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档