next.js 为什么在使用fetch获取服务器上的数据时,缓存不工作?

brjng4g3  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(183)

我已经创建了一个后上市的应用程序,并在每个职位点击用户将被重定向到单一的详细信息页面的职位
index.js(文章列表)

export default function Home(props) {
    const [postData, setPostData] = useState([]);

    useEffect(() => {
        fetch("https://jsonplaceholder.typicode.com/posts", { next: { revalidate: 10 } })
            .then((res) => res.json())
            .then((data) => {
                setPostData(data);
            });
    }, []);

    const cardArr = postData.map((post) => <Card data={post} key={post.id} />);

    return (
        <Layout>
            <Header>
                <div>Posts</div>
            </Header>
            {cardArr}
        </Layout>
    );
}

字符串
[id].js(单篇文章详情页)

export const PostPage = (props) => {
    const router = useRouter();

    const [post, setPost] = useState({});

    useEffect(() => {
        fetch(`https://jsonplaceholder.typicode.com/posts/${router.query.id}`, {
            next: { revalidate: 1000 },
        })
            .then((res) => res.json())
            .then((data) => {
                setPost(data);
            });
    }, []);

    return (
        <Layout>
            <Header>
                <div className={styles.header}>{post.title}</div>
            </Header>
            <div>{post.body}</div>
        </Layout>
    );
};

export default PostPage;


我正在尝试实现路由缓存。这样,如果我去一个职位,然后向服务器发出请求,数据将被缓存。下一次,如果我去同一个路由在一段时间内,然后而不是从服务器获取数据,它应该显示数据从该高速缓存。
我遵循了下一个js文档,

{ next: { revalidate: 10 } }


但它不工作,请指导我,如果我错过了什么。

kqhtkvqz

kqhtkvqz1#

看看你的代码,你似乎混合了app-dir和pages-dir逻辑。实际上,你不是在“服务器”上获取任何东西,而是在客户端上,从你的组件中useEffectuseState的使用情况来判断。作为服务器组件,你应该这样定义它:

export default async function Home(props) {
  // See how the function is asynchronous and I directly fetch inside 
  // the function body, without any effect whatsoever.
  const response = await fetch("https://jsonplaceholder.typicode.com/posts", {
    next: { revalidate: 10 },
  });

  const postData = await response.json();

  return (
    <Layout>
      <Header>
        <div>Posts</div>
      </Header>
      {postData.map((post) => (
        <Card key={post.id} data={post} />
      ))}
    </Layout>
  );
}

字符串
此外,我注意到你似乎正在使用来自next/router的路由器,它只在pages目录中工作。当使用应用程序目录时,你将从next/navigation导入它,并从传递到每个页面的searchParams prop 中检索查询。
我强烈建议你看看新的应用程序路由器的official documentation,因为你似乎根本不了解基本原理。

相关问题