服务端渲染后的 useQuery

Inf*_*911 5 javascript apollo react-apollo next.js apollo-client

我正在使用next.js和 apollo 与反应挂钩。

对于一个页面,我在服务器端渲染前 X 个“帖子”,如下所示:

// pages/topic.js

const Page = ({ posts }) => <TopicPage posts={posts} />;

Page.getInitialProps = async (context) => {
    const { apolloClient } = context;
    const posts = await apolloClient.query(whatever);

    return { posts };
};

export default Page;
Run Code Online (Sandbox Code Playgroud)

然后在组件中我想使用useQuery钩子:

// components/TopicPage.js

import { useQuery } from '@apollo/react-hooks';

export default ({ posts }) => {
    const { loading, error, data, fetchMore } = useQuery(whatever);

    // go on to render posts and/or data, and i have a button that does fetchMore
};
Run Code Online (Sandbox Code Playgroud)

请注意,useQuery此处执行的查询与我在服务器端执行的查询基本相同,以获取该主题的帖子。

这里的问题是,在组件中,我已经有了从服务器传入的第一批帖子,所以我实际上不想再次获取第一批帖子,但我仍然希望支持用户单击按钮以加载更多帖子。

我考虑了useQuery在此处调用的选项,以便它从带有查询的帖子的第二个“页面”开始,但我实际上并不想要那样。我希望主题页面在页面加载后立即加载我想要的帖子(即来自服务器的帖子)。

useQuery在这种情况下可以工作吗?或者我是否需要避开它来围绕对 apollo 客户端(来自useApolloClient)的手动查询调用的一些自定义逻辑?

Inf*_*911 2

事实证明,这只是我对 nextjs 的服务器端渲染工作原理的误解。在将生成的 html 发送到客户端之前,它会完整渲染 React 树。因此,不需要进行“第一次”useQuery调用getInitialProps或类似的操作。它只能单独在组件中使用,只要getDataFromTree在服务器端配置中正确使用,一切都会正常工作。

  • 我也想弄清楚这一点,我看到当我使用“useQuery”后控制台日志时,它将在服务器中控制台它正在加载/获取数据,但随后它不会等待它完成获取,也不会控制台日志再次是它获取的数据,相反,客户端控制台记录它也在加载/获取,这让我认为它正在执行双重获取? (2认同)