在使用 npm run build 生成静态页时,React 组件会被编译成静态 HTML,由于静态页不会执行 JavaScript,所以 useEffect 不会触发,导致数据没有被正确加载。

为了解决这个问题,可以将数据请求的代码移到一个单独的函数中,并在组件渲染时调用该函数,将获取到的数据作为 props 传递给组件。这样即使在静态页中,也可以正确显示数据。

修改 /components/InfoTotal.tsx 的代码:

import { SiteRuntime } from './SiteRuntime';

interface Props {
  totalPosts: number;
  numSorts: number;
}

export default function InfoTotal({ totalPosts, numSorts }: Props) {
  return (
    <section className='info'>
      <div className='info-fanma'>
        <h2>导航信息</h2>
        <ul>
          <li>
            <span className='l'>网站目录:</span>
            <span className='r'>{numSorts}</span>
          </li>
          <li>
            <span className='l'>收录网站:</span>
            <span className='r'>{totalPosts}</span>
          </li>
          <SiteRuntime />
        </ul>
      </div>
    </section>
  );
}

export async function getInfoTotalProps() {
  const res = await fetch('/api/total');
  const { totalPosts, numSorts } = await res.json();
  return {
    props: {
      totalPosts,
      numSorts,
    },
  };
}

在页面中使用 getInfoTotalProps 函数获取数据:

import { getInfoTotalProps } from '../components/InfoTotal';

export default function Home({ totalPosts, numSorts }) {
  return (
    <>
      <Head>
        <title>My Blog</title>
      </Head>
      <InfoTotal totalPosts={totalPosts} numSorts={numSorts} />
    </>
  );
}

export async function getStaticProps() {
  const infoTotalProps = await getInfoTotalProps();
  return {
    props: {
      ...infoTotalProps.props,
    },
  };
}

在这里,我们使用 getStaticProps 函数获取数据并将其作为 props 传递给页面组件。getStaticProps 函数只会在构建时执行一次,将数据预先加载到静态页面中,这样静态页就可以正确显示数据了。

React 静态网站生成后数据显示为 0 的问题解决方案

原文地址: https://www.cveoy.top/t/topic/m9d7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录